標籤:value 內容 space ace read 沒有 官方 valueof tar
Android LiveData簡介(一)
使用Android的LiveData,需要在gradle添加引用:
compile "android.arch.lifecycle:runtime:1.0.0" compile "android.arch.lifecycle:extensions:1.0.0" annotationProcessor "android.arch.lifecycle:compiler:1.0.0"
本文是基於三個引用的新版Version 1.0.0寫的代碼,我在使用其他版本比如Version 1.0.0alpha4,代碼運行報錯。如果遇到這種情況,請自行添加最新的版本引用。在1.0.0中,個別類和方法已經被Google Android官方廢棄或者調整,比如LifecycleActivity已經過時,Android官方已經推薦開發人員使用AppCompatActivity替換LifecycleActivity。一些關於Lifecycle的內容和技術,已經被Android官方寫入AppCompatActivity,望周知。
LiveData實現基本的Android Activity/Fragment生命週期感知,本身其持有可觀察資料,開發人員可用LiveData的onActive/onInactive實現與Android生命週期解耦/耦合,進而通過LiveData的postValue或者setValue方法,通知觀察者Observer資料的變化並請可觀察的變化資料通過Observer的onChanged傳匯出來。
(一)使用LiveData,首先建立LiveData資料,一般繼承自MutableLiveData。
MutableLiveData是LiveData的子類,添加了公用方法setValue和postValue,方便開發人員直接使用。setValue必須在主線程調用。postValue可以在後台線程中調用。
本文寫一個簡單的MyData繼承自MutableLiveData。MyData內部實現一個簡單的功能,後台運行一個長時的線程任務,該線程實現一個簡易功能:
(a)如果當前的Activity處於運行(使用者可見)狀態,則線程任務不斷累計計數器並postValue一個值給任何Observer使用。
(b)如果當前Activity處於沒有啟用狀態,則暫停線程任務,停止累計計數器。
(a)(b)兩個功能由一個線程任務完成,具體實現可參見附錄文章1。
在LiveData中,onActive方法回調錶明當前Activity處於啟用狀態,也就是Activity處於生命週期的活動狀態中(onStart,onResume),可以簡單認為當前的Activity處於前台。
LiveData的onInactive處理涉及onActive剩下的生命週期,可以簡單理解onInactive是Android的Activity/Fragment處於未啟用(後台,比如當前Activity處於生命週期的onStop,onPause)。MyData.java:
package zhangphil.app;import android.arch.lifecycle.MutableLiveData;import android.util.Log;public class MyData extends MutableLiveData<String> { private final String TAG = "LiveData"; private int count = 0; private boolean RUN = true; private LongTimeWork mThread = new LongTimeWork(); public MyData() { mThread.start(); } @Override protected void onActive() { super.onActive(); Log.d(TAG, "onActive"); RUN = true; mThread.interrupt(); } @Override protected void onInactive() { super.onInactive(); Log.d(TAG, "onInactive"); RUN = false; } private class LongTimeWork extends Thread { @Override public void run() { while (true) { try { if (!RUN) { Thread.sleep(Long.MAX_VALUE); } } catch (Exception e) { e.printStackTrace(); } count++; postValue(String.valueOf(count)); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } }}
(二)構建Observer,在Observer的onChanged中等待變化資料傳導過來。
在LiveData中的資料變化,通過postValue(可後台線程)或者setValue(主線程)設定後,將觸發Observer的onChanged,開發人員只需onChanged等待最新資料回調即可。
package zhangphil.app;import android.arch.lifecycle.Observer;import android.support.annotation.Nullable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.Toast;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyObserver observer = new MyObserver(); MyData data = new MyData(); data.observe(this, observer); } private class MyObserver implements Observer<String> { @Override public void onChanged(@Nullable String o) { Toast.makeText(getApplicationContext(),String.valueOf(o),Toast.LENGTH_SHORT).show(); } }}
小結:Android的LiveData處理與Android生命週期相關的有生命週期屬性的資料尤為便利。設想,一個任務,如果在Activity處於不可見比如使用者按Home鍵不可見時候,此時可能不希望再做處理,那麼就可以在LiveData的onInactive做一個邏輯處理,改變線程任務的狀態,如果當前Activity又被使用者調回前台,那麼可以在LiveData的onActive重新恢複任務的運行。
附錄:
1,《Android使用Thread的interrupt與sleep,重啟或暫停線程任務》連結: http://blog.csdn.net/zhangphil/article/details/78584136
Android LiveData簡介(一)