【问题标题】:IllegalStateException in ArrayAdapterArrayAdapter 中的 IllegalStateException
【发布时间】:2012-12-15 17:04:50
【问题描述】:

我正在从我的活动中调用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;
    } 

这是日志猫:

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 方法的方式。我相信这是正确的,因为当我尝试在主线程上进行网络测试时,列表视图会正确填充。

所以我的问题是,解决此问题的最佳方法是什么,以便我可以将 ASyncTask 的结果传递给活动,然后填充我的列表视图。

【问题讨论】:

    标签: android android-asynctask illegalstateexception


    【解决方案1】:

    我假设IndexPicker 是你的Activity,在这种情况下你正在做一件非常糟糕的事情来实例化它(因为它不会有一个有效的Context(正是异常告诉你的) )。 Activity 不应手动实例化,它们由 Android 系统创建和处理。

    相反,为了做你想做的事,你应该传递一个对Activity的引用,从你开始AsyncTask的地方(在AsyncTask的构造函数中)并使用该引用来调用onAsyncFinish onPostExecute回调。

    【讨论】:

      【解决方案2】:

      这里有两种可能的解决方案:

      一个 :: 向您发送 ASyncTask 的 Listview 引用,并在 ASyncTask 完成时将数据绑定到 listview。

      Two:: 你想在活动的列表视图中绑定数据,然后首先检查 ASyncTask 是否完成,然后绑定数据。要从 ASyncTask 获取数据,您需要在 ASyncTask 类中创建一个方法,当它完成时调用它,该方法返回类型是返回您的数据。

      但我认为第二种方法不好,因为您需要运行一个线程来继续检查 ASyncTask 是否完成。

      谢谢

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 2013-06-25
        • 2011-06-26
        • 2014-05-13
        • 2014-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多