11

我的应用程序启动一个线程来查询网络以获取一些数据。我想在找不到任何东西时显示 Toast 消息,但我的应用程序总是崩溃。

我尝试在线程中使用应用程序上下文,如下所示:

Toast.makeText(getApplicationContext(), "testttt", Toast.LENGTH_LONG).show();

我还尝试使用 Toast 调用创建 Runnable 并从 Thread 调用 runOnUiThread(runnable) (此 runnable 中的 Toast 调用使用 Activity 作为第一个参数)。

有没有人对如何做到这一点有任何想法?

4

4 回答 4

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();
于 2010-11-18T00:05:59.463 回答
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();
        }
    });
}
于 2010-11-17T22:47:11.553 回答
3

尝试在您的 Activity 类中实现一个扩展“处理程序”的类,并从另一个线程向它发送一条消息。在这里更详细地解释:

http://www.anddev.org/the_pizza_timer__-_threading-drawing_on_canvas-t126.html

请在问这样的问题时,包括你得到的堆栈跟踪。

于 2010-11-17T22:47:01.547 回答
1

如果您从 Activity 类运行 Handler,则可以通过引用 Activity 的 .this 来设置上下文,如下所示:

final Runnable showToastMessage = new Runnable() {
    public void run() {
        Toast.makeText(YourActivity.this, "Message", Toast.LENGTH_SHORT).show();
    }
};
于 2011-07-22T17:30:12.430 回答