【问题标题】:Calling same dialog from different threads从不同的线程调用相同的对话框
【发布时间】:2012-04-30 18:01:51
【问题描述】:

我有一个具有不同活动的 android 应用程序,它们都从网络源中提取数据。这是通过实现 Runnable 并创建一个将活动作为对象的线程来完成的。基本类如下所示:

public ActivityX extends Activity implements Runnable {

    @Override
    public onResume() {
        super.onResume();
        Thread someThread = new Thread(this);
        someThread.start();
    }

    @Override
    public run() {
        try {
            // pull web content
        }
        catch(TimeOutException e) {
            // >>> create dialog here <<<
            // go back to another activity
        }
    }
}

我尝试使用返回超时对话框的静态方法创建一个对话框助手类,然后像这样调用 show():

HelperClass.getTimeOutDialog().show();

但问题是,我不能从 run() 方法内部调用它,因为它位于不同的线程中。如果我尝试这样做,我会得到一个运行时异常说明:

无法在未调用 Looper.prepare() 的线程内创建处理程序

我需要为近十几个活动执行此对话框,并且我真的很想使用 Handler 对象并每次发送消息来调用对话框。没有更简单的方法可以做到这一点吗?不幸的是,我现在想不出来。

我的代码看起来像这样:

handler.handleEmptyMessage(1);

这是调用处理程序。以下将处理该消息:

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what == 1) {
            // show dialog here
        }
    }
};

干杯

【问题讨论】:

    标签: android multithreading dialog


    【解决方案1】:
    @Override
        public run() {
            try {
                // pull web content
            }
            catch(TimeOutException e) {
                 runOnUiThread(new Runnable(){
                     @Override
                     public void run() {
                        // >>> create dialog here <<<
                        // go back to another activity
                     }  
                 }
    
            }
        }
    

    如果你不想使用 Handler,可以试试上面的那个。

    【讨论】:

    • 这样好多了。可运行对象可以在 HelperMethod 中生成,然后该行看起来像 runOnUiThread(HelperClass.getTimeoutRunnable(this));
    【解决方案2】:
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 1) {
                // show dialog here
            }
        }
    };
    

    此代码是您活动的一部分而不是线程吗?如果它是您的非 Ui 线程的一部分,它会给您错误消息。确保处理程序实例是在您的 UI 线程中创建的,因为处理程序包含对它们在其中创建的线程的隐式引用。

    【讨论】:

    • handler是在activity类中创建的,所以可以处理消息。但我不想在我提取网页内容的每个类中添加所有这些代码。我正在寻找可以更容易完成的事情。
    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多