Приложения для Android выбрасывают VM, прерывающую работу внутри AsyncTask - PullRequest
0 голосов
/ 10 декабря 2011

Я пишу приложения для Android, используя Eclipse + SDK 8, работающий на эмуляторе Android 2.2.

Я создаю AsyncTask для обработки длительных задач в фоновом режиме.Ниже приведен код:

    public class taskSavingFavourite extends AsyncTask<Void, Void, Integer> 
{       
    @Override
    protected Integer doInBackground(Void... arg0) 
    {
        List<MainListClass> mList = new ArrayList<MainListClass>();
        String s = null;
        int addedCount= 0;

        if (mainListSubTabSelectedTab == 0) mList = buildingList;
        else mList = storeList;
        if (mList == null) return 0;
        try
        {
            for (int i = 0; i < mList.size(); i ++)
            {
                if (mList.get(i).checked == 1) 
                {
                    s = htFavourite.get(mList.get(i).id+"-"+mList.get(i).type);
                    if (s == null) 
                    {
                        addedCount ++;
                        if (!favouriteList.equals(""))
                            favouriteList = favouriteList + ";";
                        favouriteList = favouriteList +
                                        mList.get(i).id + "-" + mList.get(i).type + ":" +
                                        mList.get(i).name;
                        htFavourite.put(mList.get(i).id + "-" + mList.get(i).type, 
                                        mList.get(i).name);
                        mList.get(i).favourite = 1;
                    }
                }
                publishProgress();
            }
            if (addedCount != 0)
            {
                SharedPreferences settings = getSharedPreferences("MGS_PRIVATE_DATA", 0);
                SharedPreferences.Editor editor = settings.edit();
                editor.putString("favouriteList", favouriteList);
                //Commit the edits!
                editor.commit();
            }
        }
        catch (Exception e) {};
        return addedCount;
    }
}

Проблема в том, что при большом объеме списка (более 1000 элементов) текущая активность будет принудительно закрыта и вернется к активности запуска.Я вполне подтверждаю, что он не потерпел крах, потому что раздражающее диалоговое окно «К сожалению ...» не появляется.

Я проверяю logcat, и когда это происходит, у него всегда есть это сообщение:

12-10 14:10:28.772: D/dalvikvm(976): threadid=9: sending two SIGSTKFLTs to threadid=2 (tid=977) to cause debuggerd dump 
12-10 14:10:30.842: D/dalvikvm(976): Sent, pausing to let debuggerd run 
12-10 14:10:38.903: D/dalvikvm(976): Continuing 12-10 14:10:38.903: E/dalvikvm(976): **VM aborting***

Я не уверен, что это ошибка Android или я что-то упустил.

1 Ответ

0 голосов
/ 12 декабря 2011

Хорошо, я думаю, что нашел причину: Никогда не используйте тугую петлю внутри AsyncTask:DoinBackground.

Так что я просто помещаю Thread.Sleep(1) в цикл, тогда все работает как шарм. Может быть, это произойдет только в эмуляторе, а не на реальном устройстве (я просто думаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...