22

嗨,我想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 应用程序在这方面蹩脚/可怜/哀嚎,并且基本上没有为用户提供任何计划“b”,假设互联网始终存在 - 当它不存在时)

我的应用程序不会“跛脚(正如我所说的那样)” - 它确实有一个计划“b”,而是它“排队”发布事件并每 x 分钟重试一次......现在这是后台的一个静默线程......我在整个应用程序中进行大量用户交互我不知道用户将“在哪里”,但最终当队列/重试/队列/重试的 HTTP POST 返回“!成功!”时,我想将Toast其作为消息发送给用户(例如:“您的表单已发送”)

4

7 回答 7

58

有什么问题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();
    }
});
于 2012-12-06T15:31:51.307 回答
6

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

activity.runOnUiThread(new Runnable() {
  public void run() {
    Toast.makeText(activity.getApplicationContext(),"Toast text",Toast.LENGTH_SHORT).show();
  }
);
于 2012-12-06T15:38:49.497 回答
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();
    }
});
于 2014-11-15T04:13:19.823 回答
2

您不能只将结果转换为基类getThread()的实例。返回与 无关的aMyActivitygetThread()ThreadActivity

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

于 2012-12-06T15:42:21.633 回答
1

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

于 2013-05-25T05:08:05.213 回答
1

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

((Activity)context).runOnUiThread(new Runnable() {
    public void run() {
        // things need to work on ui thread
    }
});
于 2016-03-23T07:10:38.017 回答
0

如果它在你自己的活动中,你为什么不能打电话doToast()

于 2012-12-06T15:44:09.583 回答