这是我的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++) {}
)仍在继续运行。
我能做什么?我的解决方案有误吗?提前谢谢。
答案 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?