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

时间:2012-12-06 15:29:13

标签: android android-activity toast ui-thread

您好,我想让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归还给我,而是让我哭泣 - 我做错了什么?

:编辑:

一些背景解释“为什么”我坚持这种类型的实施。

我需要能够向用户确认“HTTP POST”事件是否成功。现在。如果用户在UI表单上单击“确定”,那么当时可能或者可能没有互联网..如果它有互联网 - 一切都很好 - 它通过HTTP POST 发布表格一切都很好 ..但是如果有没有互联网最多(99.999%的Android应用程序跛足/可怜/ mewling在这,并且基本上提供用户没有计划“b”假设在任何时候互联网都存在 - 当它不是时)

我的应用程序不会“跛脚(我称之为)” - 它确实有一个计划“b”而不是“排队”发布事件并每隔x分钟重试一次..现在这个在后台是一个静默的线程..我在应用程序中有很多用户交互我不知道用户将在哪里“但最终当队列/重试/队列/重试的HTTP POST返回时”!成功! “我希望Toast向用户发送消息(EG:”您的表单已发送“)

7 个答案:

答案 0 :(得分:53)

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

这将允许您显示消息,而无需依赖上下文来启动Toast,仅在显示消息本身时引用。

runOnUiThread无法在OpenGL View线程中运行,这就是解决方案。希望它有所帮助。

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

答案 3 :(得分:2)

您不能只将getThread()的结果强制转换为MyActivity基类的实例。 getThread()会返回与Thread无关的Activity

没有伟大的阅读:干净 - 做你想做的事的方式。在某些时候,您的“工作线程”抽象必须引用可以为您创建Toast的内容。保存一些包含对Activity子类的引用的静态变量只是为了能够快捷Toast创建,这是内存泄漏和痛苦的一种方法。

答案 4 :(得分:1)

为什么不发送BroadCastReceiver捕获的意图,然后广播接收器可以在通知托盘中创建通知。这不是祝酒,而是告诉用户他的帖子成功的方法。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

如果它在您自己的活动范围内,为什么不能只拨打doToast()