2

我已經爲這個問題困惑了兩天了。我已經檢查過這個論壇和其他論壇,但不能得到足夠接近我的問題的問題或答案。onpostexecute中的意圖上下文不爲null,但爲空例外

基本上我試圖從非活動onpostexecute執行的意圖open an activity,我送從onMarkerClick函數是在在MainActivity一個方法的上下文(MainActivty.this)和字符串。這是一個非活動構造函數,它具有上下文和字符串的參數。

問題是我得到一個null異常,但調試後,上下文不爲null,它具有MainActivity的值,但是當意圖被執行時它會返回一個空異常。我也嘗試了很多變體,例如。 Activity,getApplicationContext,this.context,(classname).context,(classname).this並嘗試全局上下文無濟於事。奇怪的是我把意圖放入if語句if(context!= null),並且它通過並執行意圖,這反過來又給了我空例外,這是沒有意義的。我知道我是新來的機器人,如果任何人有任何其他建議,打開活動,這將非常感謝。

E/AndroidRuntime:致命異常:主 工藝:com.example.quantusapps.joggertest,PID:12253 顯示java.lang.NullPointerException:嘗試調用虛擬方法「java.lang.String中android.content。在android.content.ComponentName(ComponentName.java:77) 處的android.content.Intent上的android.content.ContextWrapper.getPackageName(ContextWrapper.java:131) 上的null對象引用 上的Context.getPackageName() (Intent.java:4029) at com.example.quantusapps.joggertest.BusCoachTramInfo.onPostExecute(BusCoa chTramInfo.java:131) 在com.example.quantusapps.joggertest.BusCoachTramInfo.onPostExecute(BusCoachTramInfo.java:25) 在android.os.AsyncTask.finish(AsyncTask.java:632) 在android.os.AsyncTask。訪問$ android.os.AsyncTask $(AsyncTask.java:177) $ 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)<

這是在MainActivity法onMarkerClick

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; 
      } 
     }); 

這是不活動的構造。

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); 
+0

「非活動」似乎在擴展AsyncTask,這是正確的嗎? – 0X0nosugar

+0

你好,是的,我也嘗試把擴展的asynctask放在一個內部類,但我不知道我是否做得很好。謝謝 – kash

+0

我認爲它不一定是MainActivity的內部類,但IMO是最簡單的方法。因此,如果它是一個內部類,則不需要Context變量,只需編寫「Mainactivity.this」並讓我們看看會發生什麼。(順便說一句,沒有辦法告訴你是否在沒有看到代碼的情況下100%地完成了。 ) – 0X0nosugar

回答

0

一個事物正在實施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一部分,但它可以一樣好屬於一些其他類。

+0

非常感謝代碼,我在非活動類和MainActivity類中實現了代碼。不幸的是,我得到了兩個類的null異常的結果。在調試兩個類後,我發現上下文一直貫穿到兩個類的意圖(使用您的代碼),但它仍然在最後返回null異常。 – kash

+0

我相信我可能會爲我的項目做些什麼,或者可能已經通過向它添加了很多東西來完成它,導致某些衝突,因爲它甚至不能在MainActivity上工作。我還有另外一個選擇來嘗試我今晚會嘗試的事情,並儘快讓你知道。再次感謝,同時你也教會了我通過一些方法來做AsyncTask的新方法,這些方法在未來會非常有用。 – kash

+0

嗨,我還沒有找到空例外的原因。但是我找到了一個解決方案,使用Intent的上下文打開活動。我從MainActivity中刪除了包含我的代碼和onMarkerClick的整個方法,並將它放在onPostExecute中,在那裏檢索標記的座標。然後,當執行onMarkerclick時,它會將我的字符串變量和上下文參數傳遞給另一個擴展AsyncTask的類中的構造函數。在那裏我的數據下載了標記,並在onPostexecute Intent的上下文中工作並打開活動。 – kash