2013-05-04 4 views
5

리스너를 사용하여 클래스와 활동간에 정보를 전달하는 방법에 혼란을 느낍니다.리스너를 사용하여 AsyncTask가 완료 될 때 트리거 이벤트

시나리오는 다음과 같습니다.
Sqlite 데이터베이스에서 데이터를 읽고이 데이터를 어댑터에 전달 된 ArrayList에 넣은 다음 화면에 표시하는 작업이 있습니다.

질문 :
리스너 인터페이스를 값으로 업데이트하려고하면 내 앱이 다운됩니다. 그것은 logcat에 아무것도 보여주지 않습니다 ... 그것은 단지 응용 프로그램을 끊습니다. 누군가 내가 잘못 가고있는 부분을 친절하게 지적 할 수 있습니까? - 고마워요

Details :
DatbaseRoutines라는 클래스에 의해 데이터베이스 처리가 완료되었으며 내부에서 무거운 작업을 수행하고 있습니다. 이 메서드는 AsyncTask를 사용하여 주 스레드를 처리하지 않습니다.

나는 내가 그것을

public void setDbProcesslistener(DatabaseProcessListener dbProcesslistener) { 
    this.dbProcesslistener = dbProcesslistener; 
    } 

에 대한 세터와 함께 전용 변수

private DatabaseProcessListener dbProcesslistener; 

을 만드는 오전 내 DatabaseRoutines 클래스에서 하나의 방법

public interface DatabaseProcessListener { 
    public void ProcessingIsDone(boolean blnProcessIsFinished); 
} 

을 생성하고 인터페이스있다 처리가 끝나면 PostExecute 메서드를 사용하여 Listener를 업데이트합니다. True로 청취자의 값을 변경 (즉 DB가 처리되는 IE) 아래 코드를 내가 리스너를 구현 데이터베이스에서 수집 된 데이터를 표시하는 활동 마지막으로

  protected void onPostExecute(Boolean aBoolean) { 
       super.onPostExecute(aBoolean); 
       dialog.dismiss(); //i have progress dialog during processing and its       
       //closed here 

       if (blnUpdateSucceededStatus) 
       { 
        dbProcesslistener.ProcessingIsDone(true); 
        } 
        else 
        { 
        Toast.makeText(ctx, "Transactions Processing 
        failed",Toast.LENGTH_SHORT); 
        } ; 

입니다. 아래를보십시오. 내가 로그 캣을 발견 뒷조사 후

public class MyActivity extends Activity implements DatabaseProcessListener 
{ 

@Override 
public void ProcessingIsDone(boolean blnProcessIsFinished) { 
    if(blnProcessIsFinished){ 
     PopulateExpandableListView(); 
    } 
    public void PopulateExpandableListView() { 
    //code for populating the listview goes here; 
    } 
} 

05-05 11:11:18.590: ERROR/AndroidRuntime(22339): FATAL EXCEPTION: main 
    java.lang.NullPointerException 
    at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:258) 
    at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:141) 
    at android.os.AsyncTask.finish(AsyncTask.java:631) 
    at android.os.AsyncTask.access$600(AsyncTask.java:177) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4921) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
    at dalvik.system.NativeStart.main(Native Method) 

불행하게도 앱에 걸려있다 nullpointer 예외를 error..its 및 인터페이스는 결코 이루어집니다 사실 (즉, 처리와 데이터를 표시하는 활동을 갱신하지)

날 올바른 방향으로 나를 가리 킵니다. 감사합니다.

+1

생각하려고 모든 사람에게

덕분에 당신의 AsyncTask를 요구되었다. – Anirudh

+0

예. 나는 중단 점을 넣었고 청취자를 부르는 선에 얼어 붙었다. 고마워요 – KuriaNdungu

답변

3

답변이 도착했습니다. 나는 호출 클래스에서 리스너를 초기화하지 않았습니다. 내가 할 필요가 모든이 라인

db.setDbProcesslistener(this); 

DatabaseRoutines db = new DatabaseRoutines(MyActivity.this); 
db.setDbProcesslistener(MyActivity.this); 

에 넣어 그것은 일하기 시작했다.()을 살펴 봤는데 onPostExecute 있는지 확인 했 솔루션 :

+0

@ KuriaNdungu - DID가 게시 한 것을 게시 해 주셔서 감사합니다. 모든 사람이이 기술을 적용하려고 시도 할 수있는 코드를 충분히 보여 주신 FINE JOB에 감사드립니다. – DSlomer64

+0

아, 남자 !!!!!! 내가 한 모든 일은 신중하게 @ Kuria 코드의 처음 3 번째와 5 번째 행을 내 앱에 잘라 붙여서 내 'onPostExecute'를 수정하여 'dbProcessListener.ProcessingIsDone (true);'한 줄을 작성한 다음 NPE를 가져 왔습니다. 나는'app'에 맞게 자신의 라인에서 눈을 떴다 : dbc.setDbProcesslistener (this); 매우 중요한 기술의 예를 연구하십시오. SUPER JOB, Kuria !! 이것은 대표적인 SO Q와 (사용자의!) 작업 A! – DSlomer64

+0

@ DSlomer64 1) 질문 2) upvote erythang 3) 현상금을 시작하고 그것을 쿠 리아에게 준다. – Will

3

dbProcesslistener과 같은 소리는 NULL입니다.을 호출하기 전에 세터를 호출하고 초기화 된 Listener 객체를 전달합니까?

+0

고마워요. 그것은 실제로 문제였습니다. 나는 호출하기 전에 초기화하지 않았다. – KuriaNdungu

+0

잊어 버렸습니다. 이제 끝났습니다 :) – KuriaNdungu

관련 문제