2

지금 이틀 동안이 문제로 어려움을 겪었습니다. 이 포럼 및 다른 포럼을 확인했지만 내 문제에 충분히 근접한 질문이나 대답을 얻을 수 없습니다. onpostexecute의 의도 컨텍스트가 null이 아니지만 null 예외가 발생했습니다.

는 기본적으로 나는 내가 MainActivity의 방법에있는 onMarkerClick 함수의 컨텍스트 (MainActivty.this) 및 문자열을 보내고있다, 비 활동 onpostexecute에서 open an activity에 목적을 실행하기 위해 노력하고있어. 이것은 컨텍스트와 문자열에 대한 매개 변수가있는 비 활동의 생성자로 이동합니다.

문제는 null 예외가 발생하지만 디버깅 후 컨텍스트가 MainActivity 값을 가지지 만 인 텐트가 실행될 때 null 예외가 반환됩니다. 나는 또한 많은 변형을 시도했다. Activity, getApplicationContext, this.context, (classname) .context, (classname).이 전역 컨텍스트를 사용하지 않으려 고 시도했습니다. 이상한 점은 (context! = null) if 문에 if 문을 넣는 것입니다. 그리고 문법을 통과하고 intent를 실행합니다.이 문법은 나에게 null 예외를줍니다. 나는 누군가에게 큰 감사의 말을 전할 수있는 다른 제안이 있다면 안드로이드에 익숙하다는 것을 안다.

E/AndroidRuntime : 치명적인 예외 : 주요 프로세스 : com.example.quantusapps.joggertest, PID : 12253 java.lang.NullPointerException이 : java.lang.String의 android.content '가상 메서드 호출을 시도합니다. (ContextWrapper.java:131) android.content.Intent의 (ContextWrapper.java:131) android.content.ComponentName. (ComponentName.java:77) 의 null 객체 참조에서 Context.getPackageName() (Intent.java:4029) at com.example.quantusapps.joggertest.BusCoachTramInfo.onPostExecute (BusCoa android.os.AsyncTask에서 android.os.AsyncTask.finish (AsyncTask.java:632) 에서 com.example.quantusapps.joggertest.BusCoachTramInfo.onPostExecute (BusCoachTramInfo.java:25) 에서 chTramInfo.java:131) . $ 600 (AsyncTask.java:177)에 android.os.AsyncTask $ InternalHandler.handleMessage (AsyncTask.java:645) at android.os.Handler.dispatchMessage (Handler.java:102) android.os.Looper .loop (Looper.java:155) android.app.ActivityThread.main (ActivityThread.java:5696)에서 java.lang.reflect.Method.invoke (기본 방법)에서 자바에서 . 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

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

와 Mainactivity 방법이다. 널 예외가 발생된다

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를 넣으려고했으나 잘했는지 확신 할 수 없습니다. thanks – kash

+0

MainActivity의 내부 클래스 일 필요는 없지만 IMO가 가장 쉬운 방법이라고 생각합니다. 따라서 내부 클래스 인 경우 Context 변수가 필요 없으며 "Mainactivity.this"를 작성하고 어떤 일이 발생하는지 봅시다. (한 번에 코드를 보지 않고도 100 % 제대로했는지 여부를 알 수 없습니다.) – 0X0nosugar

답변

0

한 가지 방법은 가지 매개 변수로 MainActivity의 인스턴스를 취하는 방법의 일환으로 AsyncTask을 구현하고 수행하세요.

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의 일부가 될 수 있지만, 그것은 단지뿐만 아니라 다른 클래스에 속할 수 있습니다 : 다른 한편으로는 AsyncTaskWeakReference와 함께 작동합니다.

+0

코드에 대해 매우 고맙게 생각하며, 비 활동 클래스와 MainActivity 클래스에서 코드를 구현했습니다. 불행히도 나는 두 클래스 모두 null 예외의 동일한 결과를 얻었다. 두 클래스를 모두 디버깅 한 후, 컨텍스트가 두 클래스의 의도 (코드 사용)로 완전히 전달되지만 결국에는 예외가 반환된다는 것을 알게되었습니다. – kash

+0

나는 내 프로젝트에 뭔가를했을지 모른다고 생각한다. 또는 MainActivity조차도 작동하지 않는다고하는 일종의 충돌을 일으키는 많은 것들을 추가함으로써 그것을 수행했을지도 모른다. 나는 오늘 밤 시험해보고 가능한 한 빨리 알려주는 다른 옵션을 가지고있다. 다시 한 번 감사 드리며, 미래에 매우 도움이 될 방법을 통해 AsyncTask를 수행하는 새로운 방법을 가르쳐 주셨습니다. – kash

+0

안녕하세요, 여전히 null 예외에 대한 이유를 찾지 못했습니다. 하지만 Intent에 대한 컨텍스트를 사용하여 활동을 열어 보는 작업을 발견했습니다. MainActivity에서 코드와 onMarkerClick을 포함하는 전체 메서드를 제거하고 내 마커의 좌표가 검색되는 onPostExecute에 배치합니다. 그런 다음 onMarkerclick이 실행되면 내 문자열 변수 및 컨텍스트 매개 변수가 AsyncTask를 확장하는 다른 클래스의 생성자에 전달됩니다. 마커에 내 데이터가 다운로드되고 onPostexecute에 Intent의 컨텍스트가 작동하고 Activity가 열립니다. – kash