您好我正在开发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();
答案 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中提供了更多信息。