您好,我想让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:”您的表单已发送“)
答案 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()
?