在Handler中,我们可以将一些数据从后台线程传递到UI线程,如下所示:
private void someBackgroundThreadOperation() {
final String data = "hello";
handler.post(new Runnable() {
public void run() {
Log.d(TAG, "Message from bg thread: " + data);
}
}
}
如果我们使用上述内容,那么我们就不能使用Handler.removeCallbacks(Runnable r),因为我们不会引用上面创建的任何匿名runnable。
我们可以创建一个Runnable实例,并将其发布到处理程序,但它不允许我们传递任何数据:
private void someBackgroundThreadOperation() {
String data = "hello";
handler.post(mRunnable); // can't pass 'data' through.
}
private Runnable mRunnable = new Runnable() {
public void run() {
Log.d(TAG, "What data?");
}
}
然后我们可以使用Handler.removeCallbacks(mRunnable)方法,因为我们有一个对它的引用。
我知道我可以自己设置一些同步以使第二种方法正常工作,但我想知道Handler是否提供了将数据传递给单个引用的Runnable的任何实用程序,几乎就像上面的示例一样?
我从浏览文档中可以想到的最接近的是使用类似的东西:
private void someUiThreadSetup() {
mHandler = new Handler(new Callback() {
@Override
public boolean handleMessage(Message msg) {
String data = (String)msg.obj;
return false;
}
});
}
private void someBackgroundThreadOperation() {
String data = "please work";
Message msg = mHandler.obtain(0, data);
mHandler.sendMessage(msg);
}
private void cleanup() {
mHandler.removeMessages(0);
}
这是正确的做法吗?
由于