2013-07-10 1 views
0

모든 앱과 해당 캐시를 나열 할 수있는 Android 앱을 개발하려고합니다. 는하지만 내가 생성 된 목록에 탭 때마다 그래서 java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.스레드 처리기에 AsyncTask 코드를 넣는 방법

내가 Hadler 스레드 내 AsyncTask를 코드를 변환 할 노력하고있어이 어떤 몸이 좀 도와주십시오 수 있기 때문에 나는 가까운 힘을 얻고있다하는 문제에 직면하고있어 이 문제. 여기 내 코드는

public class Messages extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 



    msgList = (ListView) findViewById(R.id.MessageList); 

    applicationCacheSize = new ArrayList<Long>(); 
    applicationPackageName = new ArrayList<String>(); 
    applicationName = new ArrayList<String>(); 

    cacheApplicationName = new ArrayList<String>(); 

    details = new ArrayList<MessageDetails>(); 
    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected void onPreExecute() { 
      pd = ProgressDialog.show(Messages.this, "Loading..", 
        "Please Wait", true, false); 
     }// End of onPreExecute method 

     @Override 
     protected Void doInBackground(Void... params) { 

      for (ApplicationInfo packageInfo : packages) 
      { 
       try 
       { 
        Context mContext = createPackageContext(packageInfo.packageName, CONTEXT_IGNORE_SECURITY); 
        PackageManager pm = mContext.getPackageManager(); 
        ApplicationInfo ai; 
        try { 
         ai = pm.getApplicationInfo(mContext.getPackageName(), 0); 
        } catch (final NameNotFoundException e) { 
         ai = null; 
        } 
        final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)"); 
        appNames.add(applicationName); 
        appPackageName.add(packageInfo.packageName); 
        appCache.add(mContext.getCacheDir()); 

       } 
       catch (NameNotFoundException e) 
       { 
        e.printStackTrace(); 
       } 
      } 


      for(int i=0; i<appCache.size(); i++) 
      { 

       try { 
        final PackageManager pm = getPackageManager(); 

        Method getPackageSizeInfo; 

        getPackageSizeInfo = pm.getClass().getMethod(
         "getPackageSizeInfo", String.class, IPackageStatsObserver.class); 
        getPackageSizeInfo.invoke(pm, appPackageName.get(i), new IPackageStatsObserver.Stub() { 

          @Override 
          public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) 
           throws RemoteException { 



           final String title; 
           ApplicationInfo applicationInfo; 



            try { 
             applicationInfo = pm.getApplicationInfo(pStats.packageName, 0); 
             title = (String)((applicationInfo != null) ? packageManager.getApplicationLabel(applicationInfo) : "???"); 

             MessageDetails Detail; 
             Detail = new MessageDetails(); 
             Detail.setIcon(getPackageManager().getApplicationIcon(pStats.packageName)); 
             Detail.setName(title); 
             Detail.setSub("Cache Size -> "+(((pStats.cacheSize/1024) > 0)?(pStats.cacheSize/1024):"No Cache")); 
             details.add(Detail); 
             if((pStats.cacheSize) != 0) 
             { 
              cacheApplicationName.add(title); 
             } 
            } catch (final NameNotFoundException e) {} 

           } 
         }); 
       } 
       catch (SecurityException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (NoSuchMethodException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }catch (IllegalArgumentException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (InvocationTargetException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     }// End of doInBackground method 

     @Override 
     protected void onPostExecute(Void result) { 
      CustomAdapter adapter = new CustomAdapter(details, Messages.this); 
      msgList.setAdapter(adapter); 
      pd.dismiss(); 
     }// End of onPostExecute method 
    }.execute((Void[]) null); 
} 
} 

미리 감사드립니다.

+0

사용 publishProgress 및 onProgressUpdate는 doInBackground 실행 중에 UI 스레드에 게시. – njzk2

+0

@ njzk2 실제로 그들을 시도했지만 나를 위해 일하지 않는 잘못된 매개 변수가있는 잘못된 장소에서 코딩 된 수 있습니다. 내 코드의 편집 된 버전으로 답변을 게시 할 수 있습니까? –

+0

왜 클래스를 코딩하고 있습니까? 인라인? 그것을 밖으로 이동하고 이름을주고 응용 프로그램에서 그것을 실행 .. 이해하기 쉬울 것입니다. –

답변

0

먼저 detail = new Asyntasck을 사용하지 마십시오. 아래 AsyncTask를 클래스를 작성하고 바로 사용

AsynTask myTask = new AsynTask(); 
myTask.execute(); 

그런 다음 어댑터가 실제로 백그라운드 스레드 (AsyncTask를)에서 수정, 예외가 제안 그대로. 용액 runOnUiThread()로 배치 단순히 UI 스레드로 이동되거나 :

... ... 

runOnUiThread(new Runnable() { 
    public void run() { 
    details.add(result) //use a foreach here 
    CustomAdapter adapter = new CustomAdapter(details, Messages.this); 
    adapter.notifyDataSetChanged(); 
    msgList.setAdapter(adapter); 
    pd.dismiss(); 

    } 
}); // end of runOnUiThread 

... ... 
+1

'detail = new Asyntasck'을 어디에서 보았는지 모르겠다. – njzk2

+0

내 실수로, 그는 자신의 배열을 anariaize. – marshallino16

+0

@ marshallino16'details'리스트에 추가하는 동안'result'를 어떻게 선언하고 초기화합니까? –

관련 문제