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

con*_*ers 18 android ui-thread toast android-activity

嗨,我想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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class AppMain extends MyActivity {
   //blah
}
Run Code Online (Sandbox Code Playgroud)

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

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

只要它Activity是一个" MyActivity它应该有用 - 但问题是---> Looper.getMainLooper().getThread();不是归还MyActivity给我而是它让我哭泣 - 我做错了什么?

:编辑:

一些背景解释"为什么"我坚持这种类型的implmentation.

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

我的应用程序不会"跛脚(我称之为)" - 它确实有一个计划"b"而不是"队列"发布事件并重试每x分钟..现在这是一个背景中的无声线程..我在整个应用程序中有大量的用户交互我不知道用户将在哪里"但最终当队列/重试/队列/重试的HTTP POST返回"!成功!"我希望将Toast其作为消息发送到用户(EG:"您的表格已发送")

Raw*_*ode 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();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • @Rawkode我发现这篇文章http://www.helloandroid.com/tutorials/broadcast-receiver-activity基本上完成了我需要的工作..简单,优雅 (3认同)

AAn*_*kit 6

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

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