淺談Android AsyncTask內(nè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)文章
Android高級(jí)開(kāi)發(fā)之性能優(yōu)化典范
本文從電量,視圖,內(nèi)存三個(gè)性能方面的知識(shí)點(diǎn)給大家介紹android高級(jí)開(kāi)發(fā)之性能優(yōu)化的相關(guān)知識(shí),希望對(duì)大家有所幫助2016-05-05
Android的Glide庫(kù)加載圖片的用法及其與Picasso的對(duì)比
這篇文章主要介紹了Android的Glide庫(kù)加載圖片的用法及其與Picasso的對(duì)比,Glide的加載gif圖片的功能和性能受到了很多開(kāi)發(fā)者的青睞,需要的朋友可以參考下2016-04-04
Android RecyclerView多類(lèi)型布局卡片解決方案
這篇文章主要介紹了Android RecyclerView多類(lèi)型布局卡片解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換
這篇文章主要為大家詳細(xì)介紹了Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android軟鍵盤(pán)狀態(tài)彈出與消失的示例
這篇文章主要介紹了本篇文章主要介紹了Android軟鍵盤(pán)狀態(tài)彈出與消失的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
使用 Lambda 取代 Android 中的匿名類(lèi)
本文主要介紹使用Lambda 取代 Android 中的匿名類(lèi)的資料,這里這里了相關(guān)資料及簡(jiǎn)單示例代碼幫助大家學(xué)習(xí)參考此部分的知識(shí),有需要的小伙伴可以參考下2016-09-09
Android筆記之:深入為從右向左語(yǔ)言定義復(fù)雜字串的詳解
本篇文章是對(duì)Android中為從右向左語(yǔ)言定義復(fù)雜字串進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Android實(shí)現(xiàn)高德地圖首頁(yè)效果(上)
這篇文章主要為大家詳細(xì)介紹了基于Android實(shí)現(xiàn)高德地圖首頁(yè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-08-08

