2011-12-10 78 views
0

我正在使用Eclipse + SDK 8編寫Android應用程序,運行在Android 2.2仿真器上。Android應用程序拋出虛擬機在AsyncTask中湮滅

我創建了一個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; 
    } 
} 

的問題是:當mList大(超過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的bug還是我錯過了一些東西。

回答

0

好吧,我想我找到了原因:切勿使用密集的循環中AsyncTask:DoinBackground

因此,我只是把Thread.Sleep(1)放在循環內,那麼所有東西都像魅力一樣。也許這隻會發生在模擬器,而不是一個真正的設備(我只是猜測)。

相關問題