【问题标题】:Android: AsyncTask and Communicating Errors on UI threadAndroid:AsyncTask 和 UI 线程上的通信错误
【发布时间】:2012-08-27 20:34:34
【问题描述】:

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

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

使用此类时如何传达错误?

【问题讨论】:

    标签: android exception android-asynctask


    【解决方案1】:

    我的建议是在 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
            }
        }
    
    } 
    

    【讨论】:

    • 我看到的问题是onPostExecute 在错误条件下没有被调用。所以即使我隐藏了错误,我也不知道什么时候应该显示它。也许我的观察是错误的。也许doInBackground 应该返回一个对象。该对象是错误的异常,否则为 byte[]。
    • 似乎后台线程中的异常无法处理。由于此类错误,线程正在死亡。将 try-catch 包裹在危险代码周围。
    【解决方案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 方法。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        没有。只需在 AsyncTask 中发出广播并在您喜欢的任何地方处理广播。 AsyncTask 只需要一个 Context 来发出它,您可以将它传递给它。可能希望作为粘性广播发布,以便您可以恢复它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-22
          • 1970-01-01
          • 2012-04-10
          • 2014-10-07
          • 1970-01-01
          • 2013-10-09
          相关资源
          最近更新 更多