【问题标题】:Multithreading and Dialogs show/dismiss give exceptions in Android多线程和对话框显示/关闭在 Android 中给出异常
【发布时间】:2012-05-17 20:33:02
【问题描述】:

我有创建多个线程的 Android 应用程序。有些线程使用线程安全的HttpClient不断从服务器获取数据。

示例 1:线程 1 -> 从服务器获取数据,现在我必须显示 Dialog 来通知用户。 示例 2:线程 2 ->(在 UI 线程上)显示模式 PendingDialog -> 启动线程 2 -> 在服务器上发布数据并检查响应(不在 UI 线程上)-> runOnUiThread() {dismissPendingDialog()...}

基本上我正在创建线程:

classRunnableInstance = new MyRunnable(...);
classThreadInstance = new Thread(classRunnableInstance);
classThreadInstance.start();

“获取”线程的基本结构是:

public void run() {
    try {
        while(shouldRun) {
            SomeResultObj result = MyHttpClient.invokeSomeMethod();
            if(checkIfIMustInformUser(result)) {
                inform();
            }
            sleep();
        }
    }
    catch(IOException e) {
        activityGivenInConstructor.showFetchingDataError(e); //show on UI-thread
    }
}

protected void inform(final SomeResultObj result) {
    activityGivenInConstructor.runOnUiThread(new Runnable() {
        public void run() {
            Dialog dialog = MyDialogUtils.create(context, messageId);
            ...
            dialog.show();
            //or pendingDialog.dismiss();
        }
    });
    shouldRun = false;
    return;
}

protected void sleep() {
    try {
        Thread.sleep(AppConstants.SLEEP_DELAY);
    }
    catch(InterruptedException e) {
        shouldRun = false;
    }
}

另外我正在停止和启动线程:onPause()onResume()

我正在成功处理“一次显示一个对话框”。但是当用户执行某些操作时会出现问题 - 例如:

  • 退出应用程序
  • 转到新活动
  • 返回首页等

当我显示对话框时(注意:在 UI 线程上),有时会出现 WindowManager$BadTokenExceptionIllegalStateExceptionMyActivity has leaked window 等异常。

我可以在dialog.show()之前查看:

if(!Thread.interrupted() && shouldRun && !activityGivenInConstructor.isFinishing())

但这只能解决退出应用程序问题。在其他情况下会出现一些例外情况。

我应该如何实现这个?不会再有例外了? 这个 check/if(!Thread.interrupted()... 我能做的就是防止异常上升吗?

【问题讨论】:

    标签: java android multithreading exception dialog


    【解决方案1】:

    我不是安卓开发者,但我做了一些 UI 编码。从您发布的内容来看,如果用户当前所在的屏幕不需要显示模式对话框,那不应该以编程方式处理吗?更具体地说是 checkIfIMustInformUser(result) 方法调用?

    【讨论】:

    • 考虑这种情况:我从服务器中提取数据。这些数据可以随时更改。例如boolean。如果获取的booleantrue,那么我会通知用户,如果它是false,那么什么都不会发生,用户可以不受干扰地使用这个活动(“屏幕”)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多