我的应用程序启动一个线程来查询Web以获取某些数据。我想在找不到任何内容时显示Toast消息,但我的应用程序总是崩溃。
我已尝试在线程中使用应用程序Context,如下所示:
Toast.makeText(getApplicationContext(), "testttt", Toast.LENGTH_LONG).show();
我也尝试使用Toast调用创建一个Runnable并从Thread调用runOnUiThread(runnable)(此runnable中的Toast调用使用Activity作为第一个参数)。
有没有人对如何做到这一点有任何想法?
答案 0 :(得分:22)
尝试将内部发布到Handler对象。
final Handler mHandler = new Handler();
final Runnable mUpdateResults = new Runnable() {
public void run() {
Toast(this, message, duration).show();
}
new Thread() {
public void run() {
mHandler.post(mUpdateResults);
}
}.start();
答案 1 :(得分:4)
Toast.makeText().show()
肯定需要在UI线程上运行。
你应该使用Octavian Damiean提到的AsyncTask,但如果你开始使用runOnUiThread,那么这里有一些代码:
public void showToastFromBackground(final String message) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
});
}
答案 2 :(得分:3)
尝试在Activity类中实现一个扩展“Handler”的类,并从另一个线程向它发送一条消息。这里详细解释:
http://www.anddev.org/the_pizza_timer_-_threading-drawing_on_canvas-t126.html
请问这样的问题,包括你得到的堆栈跟踪。
答案 3 :(得分:1)
如果您正在从Activity类运行Handler,您可以通过引用您的Activity的.this来设置上下文,如下所示:
final Runnable showToastMessage = new Runnable() {
public void run() {
Toast.makeText(YourActivity.this, "Message", Toast.LENGTH_SHORT).show();
}
};