0

我有创建多个线程的 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$BadTokenException,IllegalStateException等异常MyActivity has leaked window

我可以检查之前dialog.show()

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

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

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

4

1 回答 1

0

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

于 2012-05-20T17:53:49.660 回答