我从我的活动中调用AsyncTask
从网上下载字符串。下载字符串后,我想将字符串传递给我的活动,以便我可以解析它,然后填充ListView
。
我在我的活动中创建了一个方法,在onPostExecute()
中调用,这就是代码:
@Override
protected void onPostExecute(String res) {
IndexPicker index = new IndexPicker();
index.onAsyncFinish(res);
}
这是我的onASyncFinish()
方法:
public void onAsyncFinish(String json) {
ArrayList<Index> arrayList = parseJSON(json);
populateListView(arrayList);
}
}
在populateListView
方法中是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;
}
这是logcat:
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的结果传递给活动,然后填充我的列表视图。
答案 0 :(得分:1)
我假设IndexPicker
是您的Activity
,在这种情况下,您正在做一个非常糟糕的事情来实例化它(因为它没有有效的Context
(确切地说是什么)例外是告诉你))。活动不应手动实例化,而是由Android系统创建和处理。
相反,为了做你想做的事,你应该从Activity
开始AsyncTask
(在AsyncTask
的构造函数中)传递对onAsyncFinish
的引用,并使用该引用在onPostExecute
回调中致电{{1}}。
答案 1 :(得分:0)
这里有两个可能的解决方案:
One ::发送Listview引用ASyncTask并在ASyncTask完成时将数据绑定到listview。
两个::你想在活动中的listview中绑定数据然后首先检查ASyncTask是完成工作然后绑定数据。要从ASyncTask获取数据,需要在ASyncTask类中创建一个方法,在完成后调用它,此方法的返回类型是返回您的数据。
但我认为第二种方法并不好,因为你需要运行一个线程来继续检查ASyncTask是否完成。
由于