我有Android应用程序,可以创建多个线程。有些线程使用线程安全的HttpClient来连续从服务器获取数据。
示例1:线程1 - >从服务器获取数据,现在我必须显示Dialog通知用户。 例2:线程2 - > (在UI线程上)show modal 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())
但这只能退出应用程序问题。在其他情况下会出现一些例外情况。
我该如何实现?那不会有例外吗? 这是检查/ if(!Thread.interrupted()...我可以做些什么来防止异常上升?
答案 0 :(得分:0)
我不是andriod开发人员,但我做了一些UI编码。从您发布的内容来判断,如果用户当前所在的屏幕不需要显示模式对话框,那么不应该以编程方式处理吗?更具体地说checkIfIMustInformUser(result)方法调用?