代码之家  ›  专栏  ›  技术社区  ›  Andrew

从线程发布Toast消息

  •  11
  • Andrew  · 技术社区  · 15 年前

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

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

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

    我还尝试用Toast调用创建一个Runnable,并从线程中调用runOnUiThread(Runnable)(这个Runnable中的Toast调用使用Activity作为第一个参数)。

    有人对如何做到这一点有什么想法吗?

    4 回复  |  直到 15 年前
        1
  •  22
  •   davidcesarino    15 年前

    尝试将内部发布到处理程序对象。

    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();
    
        2
  •  4
  •   Brandon O'Rourke    15 年前

    Toast.makeText().show() 肯定需要在UI线程上运行。

    您可能应该使用像屋大维·达米安提到的异步任务,但是如果您设置使用它,这里有一些使用runOnUiThread的代码:

        public void showToastFromBackground(final String message) {
        runOnUiThread(new Runnable() {
    
            @Override
            public void run() {
                Toast.makeText(this, message, Toast.LENGTH_LONG).show();
            }
        });
    }
    
        3
  •  3
  •   Fredrik Wallenius    15 年前

    尝试在活动类中实现扩展“Handler”的类,并从另一个线程向其发送消息。详细说明如下:

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

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

        4
  •  1
  •   Chuck D user2117118    15 年前

    如果正在从Activity类中运行处理程序,则可以通过仅引用来设置上下文。您的活动如下所示:

    final Runnable showToastMessage = new Runnable() {
        public void run() {
            Toast.makeText(YourActivity.this, "Message", Toast.LENGTH_SHORT).show();
        }
    };