1

我有一个函数可以发出 http 请求并解析响应 json 数据。该函数在 AsyncTask 类中调用。我定义了一个函数来检查在调用 asynctask 之前是否存在连接。但是一旦连接检查器函数返回 true...我的函数在 asynctask 类中运行并且设备失去连接,应用程序强制关闭。

private void parseJson()
{
    // HTTP request and JSON parsing done here
}

class getData extends AsyncTask <Void,Void,Void>
{


@Override
protected Void onPreExecute(Void...arg0)
{
    super.onPreExecute();
    //progress dialog invoked here
}

@Override
protected Void doInBackground(Void...arg0)
{
    parseJSON();
    return null;
}
@Override
protected Void onPostExecute(Void...arg0)
{
    super.onPostExecute();
    //UI manipulated here
}

}

我如何通知用户有关 doInBackground() 方法中发生的异常并正确处理异常,因为 doInBackground() 不允许诸如触发 toast 消息之类的事情。

4

3 回答 3

3

这样做

class getData extends AsyncTask <Void,Void,Boolaen>
{


@Override
protected Void onPreExecute(Void...arg0)
{
    super.onPreExecute();
    //progress dialog invoked here
}

@Override
protected Boolaen doInBackground(Void...arg0)
{
    try{ 
          parseJSON();
          return true;
    }catch(Exception e){
      e.printStackStrace();
    }

    return false;
}
@Override
protected Void onPostExecute(Boolaen result)
{
    super.onPostExecute(result);
    if(result){
      //success
    }else{
      // Failure
    } 

    //UI manipulated here
}

}
于 2013-08-30T06:01:54.297 回答
2

我的方法看起来像这样。引入一个通用的 AsyncTaskResult,您可以在其中存储您的真实返回值(如果需要)或在doInBackground(). onPostExecute您可以检查是否发生异常并通知您的用户(或处理您的返回值)。

异步任务结果:

public class AsyncTaskResult<T> {
    private T mResult;
    private Exception mException = null;

    public AsyncTaskResult() {
    }

    public AsyncTaskResult(T pResult) {
        this.mResult = pResult;
    }

    public AsyncTaskResult(Exception pException) {
        this.mException = pException;
    }

    public T getResult() {
        return mResult;
    }

    public boolean exceptionOccured() {
        return mException != null;
    }

    public Exception getException() {
        return mException;
    }
}

异步任务:

public class RessourceLoaderTask extends AsyncTask<String, String, AsyncTaskResult<String>> {

    public RessourceLoaderTask() {
    }

    @Override
    protected AsyncTaskResult<String> doInBackground(String... params) {
        try {
            // Checked Exception
        } catch (Exception e) {
            return new AsyncTaskResult<String>(e);
        }
        return new AsyncTaskResult<String>();
    }

    @Override
    protected void onPostExecute(AsyncTaskResult<String> pResult) {
        if (!pResult.exceptionOccured()) {
            //...
        } else {
            // Notify user
        }

    }
}
于 2013-08-30T06:03:55.403 回答
0

getData在课堂上创建一个字段。放入doBackground,检查onPostExecute

于 2013-08-30T05:48:02.503 回答