2010-10-13 90 views
2

在处理程序,我们可以从后台线程传递一些数据到UI线程这样的:使用Handler将数据从bg线程传递到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),因为我们赢了”没有引用我们上面创建的任何匿名runnables。

我们可以创建一个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); 
} 

这是做的正确方法?

感谢

+0

我多次使用(String data =(String)msg.obj;) – 2010-10-13 16:45:20

回答

相关问题