Android:UI线程上的AsyncTask和Communicating Errors

时间:2012-08-27 20:34:35

标签: android exception android-asynctask

我正在使用Android AsyncTask从网上获取一些数据。它是一个简单的程序('破解我')从random.org获取字节并显示字节。该程序还将random.org的公钥用于检测拦截代理。

我已实施onPreExecutedoInBackgroundonPostExecute。 “一切顺利”时需要这些方法。当doInBackground出现问题时,我无法显示AlertDialog,因为它不是UI线程。该接口还缺少在UI线程上执行的onError或类似方法。

使用此课程时如何传达错误?

4 个答案:

答案 0 :(得分:2)

我的建议是在AsyncTask类中创建字段。如果有什么不对的地方就会抛出一些例外:

class SomeAsyncTask<..> extends AsyncTask<..> {
    Exception exception = null;
    public doInBackground(...) {
        try {
            . . . 
        } catch (Exception ex) {
            exception = ex;
        }
    }

    public onPostExecute(...) {
        if (exception != null) {
            // process exception on UI thread
        }
    }

} 

答案 1 :(得分:2)

我在doInBackground中发现错误,将Exception保存在字段变量中,如果发生错误,请检入onPostExecute

private Exception exception = null;

protected Void doInBackground(Void... params){
    try{
        doStuff();
    } catch (Exception ex){
        exception = ex;
    }

    return null;
}

protected void onPostExecute(Void result){
    if(exception != null){
        showException(exception);
    }
}

您可以使用此代码轻松创建自己的界面,然后在使用时实施doStuffshowException方法。

答案 2 :(得分:1)

您应该返回onPostExecute()所需的任何信息,并在那里显示您的对话框。或者您可以将其作为AsyncTask子类的成员存储在本地。

答案 3 :(得分:0)

没有。只需在AsyncTask中发出广播并在任何你喜欢的地方处理广播。 AsyncTask只需要一个Context来发布它,你可以传递给它。可能想发布Sticky广播,以便你可以恢复它。