2011-04-08 78 views
0

这一切都开始了,因为我想在后台线程中显示Toast消息。 (Toast消息在尝试加载它们时会崩溃而不告诉它们加载UI线程)现在我意识到我想要显示Toast消息并关闭后台线程,这是一种错误处理并让用户知道错误。Android离开doInBackgroundThread而不离开活动?

后台线程中的所需条件将用户带到新的活动并完成当前的活动。这样可行。

现在我注意到,我不知道另一种方式来结束backgroundthread并在同一活动上显示吐司消息?

如何从doInBackground结束后台线程?

回答

0

您需要为您的任务执行cancel()方法。然后,当它取消而不是运行onPostExecute()时,它会调用onCancelled()。把你的Toast消息放在那里。

+0

谢谢取消方法关闭对话框,我不能让onCancelled()永远执行,但! – CQM 2011-04-09 22:16:52

+0

在调用我的后台线程的活动中,我有一个_initTask.cancel(true),用于在活动停止时停止后台线程。然后在我的doInBackground()方法中,在尝试返回之前检查this.isCancelled()。当doInBackground()检测到isCancelled()时,它会自动执行onCancelled()方法,而不是onPostExecuteMethod()。 – 2011-04-10 23:14:31

0

RD如果我可能会建议一个相当扭曲的方法来处理后台线程中的错误。考虑将调用包装在后台线程的try catch中并返回一个有状态的对象。所以如果你想要后台线程返回一个字符串,创建一个BoolString类。

//a utility class to signal success or failure, return an error message, and return a useful String value 
//see Try Out in C# 
public final class BoolString { 
public final boolean success; 
public final String err; 
public final String value; 

public BoolString(boolean success, String err, String value){ 
    this.success= success; 
    this.err= err; 
    this.value= value; 
} 
} 

用法:

public BoolString tryEncrypt(String inString, String password) { 
    try { 
     String value= encrypt(inString, password); 
     return new BoolString(true,"",value); 
    } 
    catch (GeneralSecurityException e){ 
     return new BoolString(false,e.getMessage(),""); 
    } 
} 

    protected void onPostExecute(BoolString result){   
     progress.dismiss(); 
     if (result.success){ 
       result.value; 
     } 
     else { 
       result.err; 
     } 
    }