关于使用AsyncTaskLoader的使用
簡介
不管是在Android應(yīng)用開發(fā)還是Android平臺(tái)開發(fā)中,異步處理通常是最基本的coding要求。如果你還在主線程中寫一些數(shù)據(jù)庫,網(wǎng)絡(luò)請(qǐng)求,讀寫本地文件等操作的話那說明你還不是一個(gè)合格的Android程序員。
通常情況下我們使用的最多的Android異步處理方法是AsyncTask和Handler,但今天要給大家?guī)淼氖谴蠹也怀J褂玫腁syncTaskLoader的使用方法。
AsyncTaskLoader從名字看出來它似乎和AsyncTask有關(guān)系,看一下Google官方是怎么給AsyncTaskLoader下定義的:
Abstract Loader that provides an AsyncTask to do the work果然是樣,AsyncTaskLoader是使用一個(gè)AsyncTask來進(jìn)行異步處理的。那么問題來了,既然都有了AsyncTask了為什么還要搞出來一個(gè)AsyncTaskLoader呢?
其實(shí)AsyncTaskLoader遠(yuǎn)沒有大家想的那么簡單。說的通俗一點(diǎn),如果把AsyncTask比作一臺(tái)烤面包機(jī)的話,那么AsyncTaskLoader就是操作烤面包機(jī)的面包師。AsyncTask如同烤面包機(jī)接受命令完成面包的烤制任務(wù),一旦任務(wù)完成它就停止了工作。然而AsyncTaskLoader如同面包師一樣要根據(jù)顧客的需求來使用烤面包機(jī)。顧客會(huì)不停的光顧,那么面包師就會(huì)不停的使用烤面包機(jī)烤面包。
具體事例
下面我們就通過烤面包機(jī)和面包師的例子來演示一下AsyncTaskLoader的使用方法。
首先肯定少不了面包師(Baker):
package com.example.asyncloaderdemo;import java.util.ArrayList; import java.util.List;import android.content.AsyncTaskLoader; import android.content.Context;public class Baker extends AsyncTaskLoader<List<Bread>> {// 用于查詢當(dāng)前需要多少個(gè)面包BakeryCallback mCallback;//面包房回調(diào),用于獲得當(dāng)面面包需求量interface BakeryCallback {int getNeededBreads();}public Baker(Context context, BakeryCallback callback) {super(context);mCallback = callback;}@Overridepublic List<Bread> loadInBackground() {List<Bread> breads = new ArrayList<Bread>();//獲得當(dāng)前需要做的面包int needs = mCallback.getNeededBreads();for (int i = 0; i < needs; i++) {//制作面包,耗時(shí)操作breads.add(new Bread());}//面包制作完成return breads;}@Overridepublic void deliverResult(List<Bread> data) {super.deliverResult(data);}@Overrideprotected void onStartLoading() {forceLoad();}@Overrideprotected void onStopLoading() {cancelLoad();}@Overrideprotected void onReset() {super.onReset();} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
面包師有了,面包房(Bakery)也不能少
package com.example.asyncloaderdemo;import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter;public class Bakery extends BroadcastReceiver {final Baker mBaker;public static String CUSTOMER_ACTION = "com.example.asyncloaderdemo.new_customer" ;public Bakery(Baker baker) {mBaker = baker;IntentFilter filter = new IntentFilter(CUSTOMER_ACTION);baker.getContext().registerReceiver(this, filter);}@Override public void onReceive(Context context, Intent intent) {//通知面包師來客人了,要做面包了。mBaker.onContentChanged();}}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
面包房和面包師都有了,還缺一個(gè)場景(MainActivity)
package com.example.asyncloaderdemo;import java.util.ArrayList; import java.util.List; import java.util.Random;import com.example.asyncloaderdemo.Baker.BakeryCallback;import android.support.v7.app.ActionBarActivity; import android.app.LoaderManager.LoaderCallbacks; import android.content.Intent; import android.content.Loader; import android.os.Bundle; import android.util.Log;public class MainActivity extends ActionBarActivity {private LoaderCallbacks<List<Bread>> mCallbacks;//面包房private Bakery mBakery;//面包師private Baker mBaker;//面包需求量private int mNeededBreads;//唯一標(biāo)識(shí)private final int mLoaderId = 42;private BakeryCallback mBreadCallback = new BakeryCallback() {@Overridepublic int getNeededBreads() {return mNeededBreads;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mNeededBreads = 0;mBaker = new Baker(this, mBreadCallback);mBakery = new Bakery(mBaker);mCallbacks = new LoaderCallbacks<List<Bread>>() {@Overridepublic Loader<List<Bread>> onCreateLoader(int id, Bundle args) {if (mBaker == null) {mBaker = new Baker(MainActivity.this, mBreadCallback);}return mBaker;}@Overridepublic void onLoadFinished(Loader<List<Bread>> loader, List<Bread> data) {mNeededBreads = 0 ;//面包師完成面包烤制Log.d("scott", "sell " + data.size() + " breads") ;}@Overridepublic void onLoaderReset(Loader<List<Bread>> loader) {}};//面包師開始工作getLoaderManager().restartLoader(mLoaderId, null, mCallbacks);//顧客開始上門mockCustomer();}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(mBakery);}//模擬源源不斷的顧客需求private void mockCustomer(){new Thread(new Runnable() {@Overridepublic void run() {while(true){try {Thread.sleep(3000);Random random = new Random();mNeededBreads =random.nextInt(10);Intent intent = new Intent(Bakery.CUSTOMER_ACTION);sendBroadcast(intent);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
接下來我們來看一下程序運(yùn)行結(jié)果:?
?
通過上圖并結(jié)合代碼可以看出來每隔三秒就會(huì)有新的顧客上門,顧客上門后面包房通知面包師需要做面吧哦了,接著面包師就會(huì)在后臺(tái)不停的開始使用面包機(jī)(AsyncTask)做面包。
總結(jié)
說到這里可能有些同學(xué)有疑問了,我怎么從頭到尾都沒有開到AsyncTask的影子呢?你當(dāng)然看不到,這就是AsyncTaskLoader設(shè)計(jì)精妙之處,它做到了讓你唯一需要考慮的就是烤面包(異步處理)這個(gè)事物邏輯,而不需要考慮異步處理本身的實(shí)現(xiàn)上。同時(shí)這也充分體現(xiàn)了設(shè)計(jì)模式中的單一職責(zé)和最少知道原則。
使用場景
AsyncTaskLoader一般使用在數(shù)據(jù)源處于不斷更新并且請(qǐng)求刷新數(shù)據(jù)源是個(gè)耗時(shí)操作的情況下還需要UI去同步更新相關(guān)數(shù)據(jù)的場景(這句話怎么這么拗口)。
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的关于使用AsyncTaskLoader的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于loader asyncTaskLo
- 下一篇: 关于LocalBroadcastMana