蜂窝上的StrictMode InstanceCountViolation

时间:2012-06-20 13:38:46

标签: android

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

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();

1 个答案:

答案 0 :(得分:0)

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

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

要确定这是否有问题,我可以推荐以下帖子:Detecting leaked Activities in Android。如果您将看到存在与此活动相关的对象与Android Framework无关,则您遇到的问题应该由您修复。

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

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

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

answer中提供了更多信息。