2011-12-04 133 views
0

有许多问题涉及缺乏解雇ProgressDialog的能力,但他们都没有涉及我的情况。为什么ProgressDialog在这种情况下不会被解雇?

我有一个线程运行一个Runnable对象,当它完成时,将消息发送到Handler对象,我确定它与ProgressDialog坐在同一个线程上。处理程序执行此操作:

if(progressDialog != null){ 
    Log.w(TAG, "Progress dialog is dismissed"); 
    progressDialog.dismiss(); 
}else{ 
    Log.w(TAG, "Progress dialog is null"); 
} 

我已经完成了这一百万次之前,它的工作。 ProgressDialog消失。但是,在一个特定的情况下,它没有。

在这种特殊情况下,显示一个ProgressDialog(我们将调用uploadChangesDialog),然后调用一个特定的Handler(uploadChangesHandler)。关闭uploadChangesDialog后,它会检查如果为true,则会在线程中启动不同的ProgressDialog(refreshViewDialog)和Runnable(refreshViewRunnable)。但是,当Handler被调用(refreshViewHandler)时,它不能关闭对话框。但它确实日志Progress dialog is dismissed

这特别奇怪,因为refreshViewsRunnable也是在Activity启动时运行的,但它可以摆脱对话框,那就好了。上面的progressDialog变量是它唯一的类型,它应该包含任何ProgressDialog当前显示的内容。

我以前用AlertDialogs做过这件事,但他们知道如何关闭自己,所以如果我做错了什么,那我就不会注意到了。

在onCreateDialog()方法:

case DIALOG_REFRESH_VIEW: 
    progressDialog = new ProgressDialog(this); 
    progressDialog.setMessage("Loading details..."); 
    progressDialog.setCancelable(false); 
    return progressDialog; 

复制为每个实例,具有不同的消息。我确实将它更改为指向相同代码的所有对话框,并在onPrepareDialog()中设置消息,但这并未改变任何行为。

在UploadChangesRunnable:

public void run(){ 
    int result = 0; 
    if(uploadChanges()){ 
     result = 1; 
    } 
    uploadChangesHandler.sendEmptyMessage(result); 
} 

然后在uploadChangesHandler:

public void handleMessage(Message msg){ 
    if(progressDialog != null){ 
     progressDialog.dismiss(); 
    } 
    if(msg.what == 0){ 
     showDialog(DIALOG_UPLOAD_CHANGES_FAILED); //This is an AlertDialog 
    }else{ 
     //All this does is showDialog(DIALOG_REFRESH_VIEW) then run the thread. 
     //This method is in the enclosing Activity class. 
     refreshViewInThread(); 
    } 
} 

最后,refreshViewInThread方法:

private void refreshViewInThread(){ 
    showDialog(DIALOG_REFRESH_VIEW); 
    Thread thread = new Thread(new RefreshViewRunnable(refreshViewHandler)); 
    thread.start(); 
} 

而RefreshViewRunnable看起来非常类似于UploadChangesRunnable。

必须有一些特殊情况,使我失去了我进度对话框的链接,而我打消的对话可能不是正在显示的对话框,但我想不出如何可能。有任何想法吗?

+0

您曾经说过,您的处理程序正在做出响应,但未对UI进行任何更改。是否可以开始一个新的处理程序,但是尝试从之前使用的处理程序进行更改?也许你可能会把处理器的一些功能从图形变成runOnUiThread(Runnable) – 2011-12-04 23:23:31

+0

@MovieovBoris:RefreshView可能不是我选择的最好的名字。 RefreshViewRunnable只是再次下载页面的数据,Handler用新数据更新视图。这工作正常,我相信意味着处理程序必须在UI线程中。这只是它也试图解雇progressDialog,并且失败了。 – AlbeyAmakiir

回答

0

我的猜测是这是一个上下文/处理程序问题。我有类似的问题,并决定使用接口/回调,而不是处理程序,它解决了我的问题。

但是,您可以尝试以下操作,看到以下内容:>>但它会记录“进度”对话框已被取消。 < <,add:

MyActivity.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     progressDialog.dismiss(); 
     } 
    }); 
相关问题