一、Callback是什麼
Callback是Java中一種十分常見的編程模式。通俗講,Callback是一種可調用的代碼,能夠在不同代碼間傳遞,並且能夠在運行時被執行。在Android開發中,Callback最重要的用法之一是實現異步處理。
舉個例子來說,當一個應用從遠程服務器獲取數據時,我們不能讓應用停頓在那裡等待服務器響應。這時我們需要啟動一個異步任務來處理網絡請求。但是,當網絡請求完數據之後,我們需要將結果返回到UI線程中,並且做出相應的更新。而這個時候,就可以使用Callback實現數據傳遞,將結果返回給調用者並在UI線程中更新結果。
二、Callback使用方法
在Android中,Callback主要用於異步任務的處理。實現Callback通常需要兩個步驟:
(1)定義接口
我們先定義一個接口,該接口中會有需要傳遞的數據以及回調方法:
public interface IDataCallback { void onDataCallback(String data); }
這裡我們定義了一個回調接口,其中有一個onDataCallback方法用於回傳數據。這個方法將會在數據準備好並由異步任務觸發時調用。
(2)將接口作為參數傳遞到異步任務中
下面我們將接口作為參數傳遞到異步任務中,當異步任務完成時會調用回調方法:
public class MyAsyncTask extends AsyncTask { private IDataCallback callback; public MyAsyncTask(IDataCallback callback) { this.callback = callback; } @Override protected String doInBackground(Void... voids) { String result = null; //耗時操作,獲取數據 return result; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (callback != null) { callback.onDataCallback(result); } } }
我們在MyAsyncTask異步任務中定義了一個IDataCallback類型的callback對象,並在其構造方法中傳遞迴調對象。在doInBackground方法中執行耗時操作,並將結果返回給onPostExecute方法。在onPostExecute方法中檢測callback是否為空,若不為空則調用回調方法將結果返回,完成數據傳遞。
三、Callback的實際應用
(1)網絡請求
在進行網絡請求時,我們需要在後台線程中進行請求,然後將結果返回給UI線程進行相應操作。當數據準備好時,需要回傳數據。這時可以使用Callback實現異步處理。
下面是一個使用Callback實現網絡請求的例子:
public class NetworkUtils { public static void requestData(IDataCallback callback) { new Thread(new Runnable() { @Override public void run() { String result = null; //執行網絡請求獲取數據 if (callback != null) { callback.onDataCallback(result); } } }).start(); } }
我們定義一個requestData方法,將該方法的回調接口傳入異步任務中。在異步任務中進行網絡請求操作,獲取數據後回傳數據。
(2) RecyclerView刷新
當數據更新時,我們需要通知RecyclerView進行UI更新以顯示最新的列表內容。而這些更新操作通常需要在主線程中進行,否則就會出現UI卡頓的問題。將需要更新的數據傳遞給主線程可以使用Callback來實現。
下面是一個使用Callback實現RecyclerView刷新的例子:
public class ListActivity extends AppCompatActivity { private List mData = new ArrayList(); private RecyclerView mRecyclerView; private MyAdapter mAdapter; private IDataCallback mDataCallback = new IDataCallback() { @Override public void onDataCallback(String data) { runOnUiThread(new Runnable() { @Override public void run() { mData.clear(); mData.addAll(data); mAdapter.notifyDataSetChanged(); } }); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); mRecyclerView = findViewById(R.id.recycler_view); mAdapter = new MyAdapter(mData); mRecyclerView.setAdapter(mAdapter); //啟動異步任務獲取數據,並將回調接口傳遞進去 MyAsyncTask task = new MyAsyncTask(mDataCallback); task.execute(); } }
我們定義了一個IDataCallback類型的mDataCallback對象,當數據返回時會調用onDataCallback方法。在該方法中,我們通過runOnUiThread方法切換回主線程,清空數據並添加新數據,然後調用RecyclerView的notifyDataSetChanged()方法刷新顯示。
四、小結
在Android開發中,異步任務的處理是一個非常重要的問題。Callback模式可以很好的解決異步任務的返回值傳遞問題,同時也可以用於RecyclerView等需要在主線程更新UI的列表控件之中。因此,學會Callback的使用方法,將有助於我們更好地進行Android應用的開發。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/248970.html