欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Android AsyncTask內(nèi)存安全的一種使用方式

 更新時(shí)間:2018年08月09日 09:38:19   作者:pgydbh  
這篇文章主要介紹了淺談Android AsyncTask內(nèi)存安全的一種使用方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

問(wèn)題

內(nèi)部類(lèi)和內(nèi)部匿名類(lèi)會(huì)導(dǎo)致內(nèi)存泄漏,所以很多時(shí)候異步代碼寫(xiě)的很多。之后一直在想,異步代碼到底應(yīng)該怎么寫(xiě)。怎么才是規(guī)范的寫(xiě)法。怎么才是簡(jiǎn)潔的寫(xiě)法。

思路

以一個(gè)弱引用的接口作為主線程與子線程交流的橋梁。

代碼

WeakTask.java

public class WeakTask<T> extends AsyncTask<Void, Void, T> {

  private WeakReference<OnWeakTaskListener<T>> listenerReference;

  public WeakTask(OnWeakTaskListener<T> listener){
    this.listenerReference = new WeakReference<>(listener);
  }
  @Override
  protected T doInBackground(Void... voids) {
    if (listenerReference.get() != null) {
      return listenerReference.get().middle();
    }else{
      return null;
    }
  }

  @Override
  protected void onPreExecute() {
    super.onPreExecute();
    if (listenerReference.get() != null) {
      listenerReference.get().before();
    }
  }

  @Override
  protected void onPostExecute(T t) {
    super.onPostExecute(t);
    if (listenerReference.get() != null && t != null){
      listenerReference.get().after(t);
    }
  }
}

OnWeakTaskListener

public interface OnWeakTaskListener<T> {

  void before();

  T middle();

  void after(T t);
}

使用---->LoginActivity.java

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);
    initLayout();
  }

  private void initLayout(){
    findViewById(R.id.btn_login).setOnClickListener(this);
  }

  @Override
  public void onClick(View view) {
    if (view.getId() == R.id.btn_login){
      new WeakTask<Integer>(new LoginWeakTaskListener()).execute();
    } 
  }


  private class LoginWeakTaskListener implements OnWeakTaskListener<Integer>{

    @Override
    public void before() {
       ...開(kāi)始前
    }

    @Override
    public Integer middle() {
       ...內(nèi)部執(zhí)行
    }

    @Override
    public void after(Integer integer) {
       ...結(jié)果返回后處理
    }
  }
}

結(jié)論

這幾天一直在看rxJava,也一直在思考為什么要學(xué)習(xí)rxJava,當(dāng)然,我感覺(jué)既然美其名曰觀察者模式,那么它應(yīng)該解決的問(wèn)題主要在于,讓主線程中顯示的數(shù)據(jù)隨著子線程中的數(shù)據(jù)去刷新,之前看過(guò)Android官方的mvvm好像是使用了rxJava,嘗試著使用了rxJava感覺(jué)不到任何優(yōu)勢(shì)可言。如果后面有時(shí)間,會(huì)深入研究一下觀察者模式,之后再看看rxJava與rxAndroid,最近又到了秋招的時(shí)候,又一次面臨求職的難題。。。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論