使用Handler将数据从bg线程传递到UI线程?

时间:2010-10-13 16:11:47

标签: android

在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);
}

这是正确的做法吗?

由于

1 个答案:

答案 0 :(得分:1)

恕我直言,您寻求的模式被打包为AsyncTask类。