java - onpostexecute 中 Intent 的上下文不为空但出现空异常

标签 java android android-intent android-asynctask android-context

我已经被这个问题难住了两天了。我查看了这个论坛和其他论坛,但找不到足够接近我的问题的问题或答案。

基本上,我正在尝试从非 Activity onpostexecute 执行一个 open an activity 的 Intent ,我正在发送上下文 (MainActivty.this) 和字符串来自 MainActivity 方法中的 onMarkerClick 函数。这将转到非 Activity 中的构造函数,该构造函数具有上下文和字符串参数。

问题是我得到了一个空异常,但在调试之后,上下文不为空,它具有 MainActivity 的值,但是当执行 Intent 时它返回一个空异常。我也尝试过很多变化,例如。 Activity, getApplicationContext, this.context, (classname).context, (classname).this 并尝试了全局上下文无济于事。奇怪的是我将 Intent 放入 if 语句 if(context != null) 并且它通过并执行了 Intent ,这反过来又给我 null 异常,这是没有意义的。我知道我是 android 的新手,如果有人对打开 Activity 有任何其他建议,那将非常感谢。

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.quantusapps.joggertest, PID: 12253 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference at android.content.ContextWrapper.getPackageName(ContextWrapper.java:131) at android.content.ComponentName.(ComponentName.java:77) at android.content.Intent.(Intent.java:4029) at com.example.quantusapps.joggertest.BusCoachTramInfo.onPostExecute(BusCoachTramInfo.java:131) at com.example.quantusapps.joggertest.BusCoachTramInfo.onPostExecute(BusCoachTramInfo.java:25) at android.os.AsyncTask.finish(AsyncTask.java:632) at android.os.AsyncTask.access$600(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:155) at android.app.ActivityThread.main(ActivityThread.java:5696) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)<

这是带有 onMarkerClick 的 Mainactivity 方法

mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

            @Override
            public boolean onMarkerClick(Marker marker) {


                String bctID = bctExtraMarkerInfo.get(marker.getId());
                BusCoachTramInfo busCoachTramInfo = new BusCoachTramInfo(bctID, MainActivity.this);
                busCoachTramInfo.execute(bctID);

                return false;
            }
        });

这是非 Activity 构造函数。

    Context context;

    BusCoachTramInfo(String busstopID, Context context) {

    this.context = context;

    naptanIdUrl = "https://api.tfl.gov.uk/StopPoint/" + busstopID + "/Arrivals?app_key=" + tfl_API_KEY + "&app_id=9c0b3009";



}

这是空异常发生的地方。

   @Override
protected void onPostExecute(TreeMap<Integer, String[]> Map) {
    super.onPostExecute(Map);

    Intent i = new Intent(context, BusArrivalTime.class);
    context.startActivity(i);

最佳答案

完成任务的一种方法是将 AsyncTask 实现为方法的一部分,该方法将 MainActivity 的实例作为参数。另一方面,AsyncTask 将与 WeakReference 一起工作:

void doExecuteBusCoachTramInfo(final String busstopID, MainActivity activity){

    final WeakReference<MainActivity> wrActivity = new WeakReference<MainActivity>(MainActivity.this);
    new AsyncTask<Void, Void, TreeMap<Integer, String[]>>(){

        @Override
        protected TreeMap<Integer, String[]> doInBackground(Void... params)
        {
            // your code from BusCoachTramInfo here
        }

        @Override
        protected void onPostExecute(TreeMap<Integer, String[]> integerTreeMap)
        {
            // get back to the original Activity if possible:
            MainActivity activity = wrActivity.get();
            if (activity != null){
                Intent i = new Intent(activity, BusArrivalTime.class);
                activity.startActivity(i);
            }
        }
    }.execute();
}

此方法可能是 MainActivity 的一部分,但它也可以属于其他某个类。

关于java - onpostexecute 中 Intent 的上下文不为空但出现空异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44163896/

相关文章:

java - 按指定顺序运行 JUnit4 测试类

java - Android:启动从 Activity 返回结果的对话框

android - 中间 fragment (III) : Creating a activity that alternate between fragments onclick of respective button

java - 如何从 ScheduledExecutorService 中删除任务?

java - 广播 Intent 回调 : result=CANCELLED forIntent

android - 如何从 CountDownTimer 调用 Activity ?

Java映射序列

java - 在 Vaadin 应用程序中添加自己的 HTML 元素和自定义 CSS

java - 是否可以使用 Web 服务器 api 中的 MpAndroid 显示图表?

java - 如何使用 JAVA 在 MATLAB 中进行显式多线程处理?