一、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/n/248970.html
微信扫一扫 
支付宝扫一扫