2012-12-31 3 views
0

내 활동에서 AsyncTask을 호출하여 웹에서 문자열을 다운로드합니다. 문자열이 다운로드되면 문자열을 내 활동으로 전달하여 구문 분석하고 ListView을 채 웁니다. ArrayAdapter의 IllegalStateException

나는 onPostExecute()에서 호출되는 내 활동 방법을 생성하고이 코드가 무엇인지입니다 :

@Override 
    protected void onPostExecute(String res) { 
     IndexPicker index = new IndexPicker(); 
     index.onAsyncFinish(res); 
    } 

이 내 onASyncFinish() 방법 :

populateListView 방법에서
public void onAsyncFinish(String json) { 
     ArrayList<Index> arrayList = parseJSON(json); 
     populateListView(arrayList); 
    } 
} 

입니다 IllegalStateException - ArrayAdapter의 생성자가 호출 될 때 발생합니다.

public IndexItemAdapter(Context context, int layoutResourceId, 
      ArrayList<Index> data) { 
     super(context, layoutResourceId, data); // This line. 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

는 로그 캣입니다 : 연구 후

E/AndroidRuntime(821): FATAL EXCEPTION: main 
E/AndroidRuntime(821): java.lang.IllegalStateException: System services not available to Activities before onCreate() 
E/AndroidRuntime(821): at android.app.Activity.getSystemService(Activity.java:4463) 
E/AndroidRuntime(821): at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) 
E/AndroidRuntime(821): at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153) 
E/AndroidRuntime(821): at com.test.exampleapp.index.IndexItemAdapter.<init>(IndexItemAdapter.java:23) 
E/AndroidRuntime(821): at com.test.exampleapp.activity.IndexPicker.populateListView(IndexPicker.java:39) 
E/AndroidRuntime(821): at com.test.exampleapp.activity.IndexPicker.onAsyncFinish(IndexPicker.java:56) 
E/AndroidRuntime(821): at com.test.exampleapp.async.DownloadIndexJSON.onPostExecute(DownloadIndexJSON.java:45) 
E/AndroidRuntime(821): at com.test.exampleapp.async.DownloadIndexJSON.onPostExecute(DownloadIndexJSON.java:1) 
E/AndroidRuntime(821): at android.os.AsyncTask.finish(AsyncTask.java:631) 
E/AndroidRuntime(821): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
E/AndroidRuntime(821): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
E/AndroidRuntime(821): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(821): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(821): at android.app.ActivityThread.main(ActivityThread.java:5039) 
E/AndroidRuntime(821): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(821): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(821): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
E/AndroidRuntime(821): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
E/AndroidRuntime(821): at dalvik.system.NativeStart.main(Native Method) 

, 분명히 문제는 IndexPicker index = new IndexPicker();를 사용하여 onASyncFinish 메소드를 호출하고있는 방법입니다. 나는이 테스트가 주 스레드에서 네트워킹을 시도했을 때 올바른 것이라고 믿는다. listview가 올바르게 채워질 것이다.

그래서 내 질문은, 내가 내 ASyncTask 결과를 전달하고 내 목록보기를 채울 수 있도록이 문제를 해결하는 가장 좋은 방법은 무엇입니까.

답변

1

내가 IndexPicker 당신이 그것을 인스턴스화 정말 나쁜 일을하고있는 경우에 Activity이라고 믿고있어 (그것을 필요가 없습니다으로 유효한 Context (정확히 예외가 당신을 말하고 무엇을)). 활동을 수동으로 인스턴스화해서는 안되며, Android 시스템에서 작성하고 처리합니다. 당신이 원하는 일을하는 대신

는, 당신은 당신이합니다 ( AsyncTask의 생성자) AsyncTask과는 onPostExecute 콜백 onAsyncFinish를 호출하는 참조를 사용하는 것이 시작하는 곳에서 Activity에 대한 참조를 전달해야합니다.

하나 :: AsyncTask를 당신에게 목록보기 참조를 보내기 AsyncTask를이 마무리 될 때 목록보기에 데이터를 바인딩 : 여기에 두 가지 가능한 솔루션

0

.

두 가지 : 당신이 작업에서 listview의 데이터를 바인딩하려면 먼저 ASyncTask가 작업인지 확인한 다음 데이터를 바인딩하십시오. ASyncTask에서 데이터를 가져 오려면 ASyncTask 클래스에서 메소드를 작성해야합니다. 완료되면이 메소드 리턴 유형은 데이터를 리턴합니다.

하지만 두 번째 방법은 좋지 않습니다. 하나의 스레드를 실행하여 ASyncTask가 완료되었는지 계속 확인해야하기 때문입니다.

감사합니다.

관련 문제