android – 从工作线程调用ui线程

嗨,我想让Toast对我无所谓 – 什么,可以从任何线程,只要我喜欢在我的应用程序。 所以为此,我扩展了Activity类:

 import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.Toast; public class MyActivity extends Activity{ private Handler mHandler; @Override public void onCreate(Bundle savedInstanceState) { mHandler = new Handler(); super.onCreate(savedInstanceState); } private class ToastRunnable implements Runnable { String mText; public ToastRunnable(String text) { mText = text; } public void run(){ Toast.makeText(getApplicationContext(), mText, Toast.LENGTH_SHORT).show(); } } public void doToast(String msg) { mHandler.post(new ToastRunnable(msg)); } } 

所以现在我的应用程序中的所有 Activity类都是简单的

 public class AppMain extends MyActivity { //blah } 

我期望能够做到的(在工作者线程中)是这样的:

 try{ MyActivity me = (MyActivity) Looper.getMainLooper().getThread(); me.doToast("Hello World"); } catch (Exception ex){ Log.e("oh dear", ex.getMessage()); } 

只要Activity是一个“ MyActivity ”它应该可以工作 – 但问题是—> Looper.getMainLooper().getThread(); 是不是返回MyActivity给我,这让我哭了 – 我做错了什么?

:编辑:

一些背景来解释“为什么”我坚持这种types的implmentation。

我需要能够向用户确认“HTTP POST”事件已经成功。 现在。 如果用户点击“确定”的用户界面表格,它可能会或可能没有互联网在那个时候..如果它有互联网 – 一切顺利,好 – 它张贴表单通过HTTP POST 都很好,很好 ..但如果有没有互联网大多数(99.999%的Android应用程序跛脚/可怜/喵喵在这,基本上提供给用户没有计划“B”假设在任何时候都有互联网 – 当它不是)

我的应用程序不会“走(我称之为)” – 它有一个计划“B”,而不是“队列”后事件,并重试每隔x分钟..现在这是一个沉默的线程在背景中..我有大量的用户交互遍布应用程序,我不知道用户将在哪里“是”,但最终当队列/重试/队列/重试的HTTP POST返回“!成功!”我想Toast ,作为消息用户(EG:“您的表单已发送”)

Solutions Collecting From Web of "android – 从工作线程调用ui线程"

runOnUiThread什么问题?

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable

 activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show(); } }); 

使用下面的代码。 创build包含您的活动实例的活动对象

 activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(activity.getApplicationContext(),"Toast text",Toast.LENGTH_SHORT).show(); } ); 

这将允许您显示消息,而不需要依赖上下文来启动吐司,只有在显示消息本身时才引用。

runOnUiThread不是从OpenGL视图线程工作,这是解决scheme。 希望能帮助到你。

 private Handler handler = new Handler(); handler.post(new Runnable() { public void run() { Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show(); } }); 

你不能把getThread()的结果MyActivity基类的一个实例。 getThread()返回一个与Activity无关的Thread

没有很好的阅读:干净的做你想做的事。 在某些时候,你的“工作者线程”抽象将不得不提供一些可以为你创build一个Toast的东西。 保存一些包含对你的Activity子类的引用的静态variables只是为了能够快捷的Toast创build是一个内存泄漏和痛苦的秘诀。

为什么不发送由BroadCastReceiver捕获的意图,则广播接收器可以在通知托盘中创build通知。 这不是敬酒,而是通知用户他的post已经成功的方法。

如果你有你的上下文,你可以像这样从非activity类调用ui线程。

 ((Activity)context).runOnUiThread(new Runnable() { public void run() { // things need to work on ui thread } }); 

如果它在你自己的活动中,为什么你不能直接调用doToast()