当AsyncTask中的catch()抛出错误时,转到另一个活动

时间:2017-02-26 16:39:02

标签: android android-intent android-asynctask

这是我的AsyncTask:

public class GetDataTask extends AsyncTask<Void, Void, JSONArray> {

        @Override
        protected void onPreExecute() {
            // [...]
        }

        @Override
        protected void onPostExecute(JSONArray result) {

            int result_length = 0;

            try {
                result_length = result.length();
            } catch (NullPointerException e) {
                e.printStackTrace();

                // Redirect the user back to the original activity
                Intent intent = new Intent(ResultActivity.this, MainActivity.class);
                startActivity(intent);
            }


            for (int i = 0; i < result_length; i++) {
                // [...]
            }
        }

        @Override
        protected JSONArray doInBackground(Void... params) {
            // [...]
        }
}

result为null时,。length()会抛出NullPointerException。这就是为什么我想在发生这种情况时将网址重定向回MainActivity。

try {
    result_length = result.length();
} catch (NullPointerException e) {
    e.printStackTrace();

    // Redirect the user back to the original activity
    Intent intent = new Intent(ResultActivity.this, MainActivity.class);
    startActivity(intent);

问题在于它不起作用。我得到e.printStackTrace()但活动没有改变。这就像Intent不够“快”足以改变活动,下面的代码(for (int i = 0; i < result_length; i++) {})仍在继续运行。
我能做什么?我的解决方案有误吗?提前谢谢。

3 个答案:

答案 0 :(得分:0)

在AsyncTask构造函数中提供Activity引用。

private Activity activity;

public GetDataTask (Activity activity) {
   this.activity = activity;
}

然后你可以这样称呼它

activity.startActivity(new Intent(activity, MainActivity.class));

答案 1 :(得分:0)

  

它就像意图不是快速&#34;足以改变活动

当您通过startActivity()发起活动时,您不会立即产生该行动。您只是要求框架为您启动指定的活动。并不意味着,在startActivity()下面的代码之后就不会被调用。执行程序将继续执行代码,直到范围结束。如果您想在之后停止执行,则必须在return之后立即startActivity()

答案 2 :(得分:0)

就个人而言,catch (NullPointerException )总是错误的。加if (variable == null)可以说更快。

AsyncTask应该return;或停止,不一定要开始。

另一个建议:确保doInBackground返回空JSONArray而不是null

  

和下面的代码(for(int i = 0; i&lt; result_length; i ++){})仍在继续运行

当然,因为for循环不在try块内......

try {
    result_length = result.length();
} catch (NullPointerException e) {
    e.printStackTrace();

    // Redirect the user back to the original activity
    Intent intent = new Intent(ResultActivity.this, MainActivity.class);
    startActivity(intent);
}

// The result is still null here...

用更简单的空检查替换所有捕获,只是不要输入循环。

@Override
protected void onPostExecute(JSONArray result) {

    int result_length = result == null ? 0 : result.length();

    for (int i = 0; i < result_length; i++) {
        // This loop won't run when the result is null... 
    }

如果您真的想要,请检查if (result_length == 0),但同样,应该在结果完成时回调活动,然后然后您可以启动其他活动。

参考:How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?