Java onPostExecute不打开意图
基本上,我使用AsyncTask来显示Java onPostExecute不打开意图,java,android,android-asynctask,Java,Android,Android Asynctask,基本上,我使用AsyncTask来显示进度条,在进度为10之后,它应该运行位于MainActivity中的方法。当progressBar为10/10时,会导致以下错误崩溃 java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()” MapProgressTask @Override protec
进度条
,在进度
为10
之后,它应该运行位于MainActivity
中的方法。当progressBar
为10/10
时,会导致以下错误崩溃
java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()”
MapProgressTask
@Override
protected void onPostExecute(String result) {
textView.setText(result);
button.setEnabled(true);
progressDialog.hide();
MainActivity mainActivity = new MainActivity();
mainActivity.getGooglePlace();
}
main活动
protected void getGooglePlace()
{
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
Intent intent;
try {
intent = builder.build(MainActivity.this);
startActivityForResult(intent, place_picker_request);
} catch (GooglePlayServicesRepairableException e) {
e.printStackTrace();
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}
}
当
progressBar
已满时,您能告诉我如何运行该方法吗?谢谢 在onPostExecute事件中,当您从非活动类启动活动时,需要在启动活动之前添加一个标志:
protected void getGooglePlace()
{
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
Intent intent;
try {
intent = builder.build(MainActivity.this);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //Needed when starting an activity from a non-activity class
startActivityForResult(intent, place_picker_request);
} catch (GooglePlayServicesRepairableException e) {
e.printStackTrace();
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}
}
在我看来,没有必要实例化您的活动。因为这是个错误的决定。您可以将异步任务作为嵌套类放到活动中,并调用getGooglePlace()方法,但这也是一个坏主意。我建议采取以下办法
public class MyTask extends AsyncTask<Void, Void, Void> {
private WeekReference<MyListener> mListener;
public MyTask(MyListener listener) {
mListener= new WeakReference<MyListener>(listener);
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
MyListener activity = mListener.get();
if (activity != null) {
// do your stuff with activity here
}
}
}
公共类MyTask扩展了AsyncTask{
私人周刊;
公共MyTask(MyListener侦听器){
mListener=新的WeakReference(侦听器);
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
MyListener活动=mListener.get();
if(活动!=null){
//在这里进行活动
}
}
}
MainActivity MainActivity=新建MainActivity();?你想做什么?千万不要试图实例化你的活动来执行这个活动中的方法。在一个公共的独立类中创建该方法……不要自己创建活动的实例。因此,首先,删除以下行:MainActivity MainActivity=newmainActivity();mainActivity.getGooglePlace()代码>。然后,决定启动此其他活动的更好计划(例如,静态
方法,将上下文
作为参数)。在运行AsyncTask
时,请务必考虑配置更改的可能性(例如,用户旋转屏幕)。我认为在这种情况下不需要FLAG\u ACTIVITY\u NEW\u TASK
。正如您的评论所指出的,当活动由非活动上下文启动时,这是必需的,我们没有证据表明情况如此。