1

您好,我正在 android 3.2 上开发,并且有一个活动,我使用 asynctask 在工作线程上执行 sql 查询,然后在 UI 线程上填充列表视图。不知何故,有时我得到

06-20 15:25:00.270: E/StrictMode(6353): class com.abc.activity.ElencoOrdiniActivity; instances=2; limit=1
06-20 15:25:00.270: E/StrictMode(6353): android.os.StrictMode$InstanceCountViolation: class com.abc.activity.ElencoOrdiniActivity; instances=2; limit=1
06-20 15:25:00.270: E/StrictMode(6353):     at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)

是我的错吗?异步任务不保留上下文,而是使用 MyActivity.this

这是代码

    AsyncTask<Void, Void, List<JSONArray>> async = new AsyncTask<Void, Void, List<JSONArray>>()
    {

        @Override
        protected List<JSONArray> doInBackground(Void... params) {



            MyApp appState = ((MyApp)getApplicationContext());


            cursor_ordini = getHelper().getReadableDatabase().rawQuery("...");
            cursor_ordini.moveToFirst();

            List<JSONArray> ordini = new Vector<JSONArray>();
            if (cursor_ordini.getCount() > 0)
            {
                ....
                return ordini;

            }
            return null;
        }

        @Override
        protected void onPostExecute(List<JSONArray> ordini) {
            super.onPostExecute(ordini);

            MyApp appState = ((MyApp)getApplicationContext());


            ListView listView = (ListView) ElencoOrdiniActivity.this.findViewById(R.id.listView_elenco_ordini);
            listView.setAdapter( new OrdiniAdapter(ElencoOrdiniActivity.this, R.layout.elenco_ordini_instestazione, ordini));
            listView.setOnScrollListener( new EndlessOrdiniScrollListener(ElencoOrdiniActivity.this, appState.getDittaIdSelezionata(), "") );

        }

    };

    async.execute();
4

1 回答 1

0

我知道这是旧帖子。仅适用于正在寻找此问题的解决方案和解释的人。

如果出现 InstanceCountViolation 异常,则意味着可能存在 Activity 泄漏或与在 Android SDK 中如何实现 detectActivityLeaks 检查有关的问题。

为了确定这是否是一个问题,我可以推荐以下帖子:Detecting leaked Activities in Android。如果您会看到一些对象持有对此活动的引用,而这些引用与 Android 框架无关,那么您遇到的问题应该由您解决。

如果没有对象持有与 Android 框架无关的此活动的引用,则意味着您遇到了与如何实现 detectActivityLeaks 检查相关的问题。在这种情况下,要在不关闭 detectActivityLeaks 的情况下解决活动失败的问题,您可以在调试配置中启动活动之前简单地运行System.gc(),如下例所示:

 if (BuildConfig.DEBUG)
 {         
     System.gc();
 }

 Intent intent = new Intent(context, SomeActivity.class);
 this.startActivity(intent);

此答案中提供了更多信息。

于 2014-08-11T21:31:01.283 回答