Android LiveData簡介(一)

來源:互聯網
上載者:User

標籤: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簡介(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.