2013-04-18 1 views
3

처리기를 사용하여 asynctask를 시작하지만 그렇게하면 응용 프로그램이 충돌합니다. 내가 붙어있는 이유는 다른 것 (예 : onClickListener)을 통해 asynctask를 시작하면 여러 번 반복해서 실행할 수 있기 때문입니다. 매번 완벽하게 작동합니다. 내 처리기에서 asynctask를 실행하자마자 즉시 NullPointerException으로 응용 프로그램이 중단됩니다.asynctask가 처리기에서 호출 될 때 arraylist를 가져 오지 않습니다.

내 핸들러는 다음이

public Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
      new sortNearby().execute(); 
      } 

     }); 
    } 
    }; 

같은 응용 프로그램에서 스택 추적의 일부 내 코드의

라인 (100)은 AsyncTask를 아래의 첫 번째 라인을 제외하고

Caused by: java.lang.NullPointerException 
at badams.android.app.fragments.MainMenu_NearbyFragment$sortNearby.doInBackground(MainMenu_NearbyFragment.java:100) 
을 보여주는 보인다 doInBackground

protected String doInBackground(String... args) { 
    for (int i = 0; i < global.places.size(); i++) { //this is line 100 

예외가 더 있음을 이해합니다. "global.places.size()"가 null 일 가능성이 높습니다.하지만 코드의 다른 섹션에서 작업을 시작하면 정상적으로 작동하므로 핸들러에서 호출 할 때만 해당 작업을 수행하는 이유가 무엇인지 몰라요.

EDIT

@Raghunandan의 요청에 따라, 여기서 "대신"사용자 사이의 거리를 계산하는 제 AsyncTask를에 doInBackground에서 전체 코드 블록이다

class sortNearby extends AsyncTask<String, Place, String> { 
protected String doInBackground(String... args) { 
    for (int i = 0; i < global.places.size(); i++) { //THIS IS LINE 100 
    Location locationA = new Location("place"); 
    locationA.setLatitude(global.places.get(i).getLatitude()); 
    locationA.setLongitude(global.places.get(i).getLongitude()); 
    Location locationB = new Location("user"); 
    locationB.setLatitude(global.applicationLocationManager.getLatitude()); 
    locationB.setLongitude(global.applicationLocationManager.getLongitude()); 
    float dist = locationA.distanceTo(locationB); 
    dist = dist/1000; 
    global.places.get(i).setDistance(dist); 
    } 
    return null; 
} 

을 편집 2

글로벌은 응용 프로그램을 확장하는 클래스이며 다음과 같이 활동에 정의되어 있습니다.

global = (ApplicationGlobal) getActivity().getApplicationContext(); 
+0

게시물 asynctask 코드 – Raghunandan

+0

@Raghunandan은 doInBackground의 전체 코드 블록으로 질문을 업데이트했습니다. – Badams

+2

asycntask가 UI 스레드에로드되어야합니다. http://developer.android.com/reference/android/os/AsyncTask.html. 주제 스레드 규칙을 확인하십시오. – Raghunandan

답변

0

NullPointerException는 다음 중 하나 global 또는 이 null을 반환 라인 (100)에있는 경우.

동일한 디버깅을 시도 했습니까?

디버깅을 통해 상황을 파악하는 데 도움이됩니다.

또한 핸들러에서 doInBackground 메서드가 호출되는 것을 보지 못합니까?

global 변수는 어디에 정의되어 있습니까? 언제 어디서 초기화 되나요?

+3

doInBackground() 메서드를 재정의하는 메서드를 호출 할 필요가 없으며 onPreExecute()가 실행되는 즉시 실행됩니다. – Raghunandan

+0

예 이제 알 수 있습니다. AsyncTask 확장 클래스에 응답했을 때 누락되었습니다. 그러나 전역 변수가 초기화되는 곳/방법은 아직 없습니다. –

+0

@BhushanBhangale 편집 2에서 그 위로 올라간다. – Badams

관련 문제