Android中的AsyncTask和错误处理

148

我正在将代码从使用 Handler 改为 AsyncTask。后者在异步更新和在主UI线程中处理结果方面表现很好。但是,如果在 AsyncTask#doInBackground 中出现问题,我不清楚如何处理异常。

我的做法是创建一个错误处理程序并向其发送消息。这个方法运行良好,但是这是否是“正确”的方法或者是否有更好的替代方法?

此外,我知道如果将错误处理程序定义为 Activity 字段,则应在 UI 线程中执行。然而,有时(非常难以预测)我会收到一个异常,表示从 Handler#handleMessage 触发的代码正在错误的线程上执行。我应该在 Activity#onCreate 中初始化错误处理程序吗?将 runOnUiThread 放入 Handler#handleMessage 中似乎多余,但它运行得非常可靠。


你为什么想要转换你的代码?有充分的理由吗? - HGPB
4
@Haraldo,这是更好的编码实践,至少这就是我的感觉。 - Bostone
12个回答

-2
另一种可能性是使用Object作为返回类型,并在onPostExecute()中检查对象类型。这样做很简洁。
class MyAsyncTask extends AsyncTask<MyInObject, Void, Object> {

    @Override
    protected AsyncTaskResult<JSONObject> doInBackground(MyInObject... myInObjects) {
        try {
            MyOutObject result;
            // ... do something that produces the result
            return result;
        } catch (Exception e) {
            return e;
        }
    }

    protected void onPostExecute(AsyncTaskResult<JSONObject> outcome) {
        if (outcome instanceof MyOutObject) {
            MyOutObject result = (MyOutObject) outcome;
            // use the result
        } else if (outcome instanceof Exception) {
            Exception e = (Exception) outcome;
            // show error message
        } else throw new IllegalStateException();
    }
}

1
完全不相关 - Dinu

-2

如果您知道正确的异常,那么您可以调用

Exception e = null;

publishProgress(int ...);

例如:

@Override
protected Object doInBackground(final String... params) {

    // TODO Auto-generated method stub
    try {
        return mClient.call(params[0], params[1]);
    } catch(final XMLRPCException e) {

        // TODO Auto-generated catch block
        this.e = e;
        publishProgress(0);
        return null;
    }
}

并转到“onProgressUpdate”并执行以下操作

@Override
protected void onProgressUpdate(final Integer... values) {

    // TODO Auto-generated method stub
    super.onProgressUpdate(values);
    mDialog.dismiss();
    OptionPane.showMessage(mActivity, "Connection error", e.getMessage());
}

这只在某些情况下有用。您还可以保留一个全局异常变量并访问该异常。


1
请不要这样做。那真的是非常糟糕的风格! - JimmyB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接