一、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 ListmData = 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应用的开发。