0
private class AsyncCaller extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     //this method will be running on background thread so don't update UI from here 
     //do your long running http tasks here,you don't want to pass argument and u can access the parent class' variable url over here 
     new DummyContent().fetchData(); 
     return null; 
    } 
} 

它拋出,我試過的AsyncTask以類似的方式來 How to use AsyncTask correctly in Android後「錯誤時拋出不應該被扔到」在AsyncTask中更新ListFragment?

public static void fetchData() { 
    // Add some sample items. 
    for (int i = 1; i <= COUNT; i++) { 
     addItem(createDummyItem(i)); 
    } 

    Authenticator.setDefault(new Authenticator() { 
     @Override 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(
        DummyContent.UNAME, DummyContent.PASSWORD.toCharArray()); 
     } 
    }); 

    try { 
     DummyContentRegistry registry = new XMLDummyContentParser(url).parse(); 
     for (DummyItem t: registry.getTeachers()) { 
      addItem(t); 
     } 
    } catch (Exception e) { 
     fail("Exception should not have been thrown"); 
    } 
} 

基本上同樣的問題Failed to call a dynamic method in a static context?運行時錯誤。

07-25 05:44:12.080 21933-22106/********.myapplication E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3 
                        Process: ***********.myapplication, PID: 21933 
                        java.lang.RuntimeException: An error occurred while executing doInBackground() 
                         at android.os.AsyncTask$3.done(AsyncTask.java:309) 
                         at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
                         at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
                         at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
                         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                         at java.lang.Thread.run(Thread.java:818) 
                        Caused by: java.lang.AssertionError: Exception should not have been thrown 
                         at org.junit.Assert.fail(Assert.java:88) 
                         at ***********.myapplication.dummy.DummyContent.fetchData(DummyContent.java:58) 
                         at ***********.myapplication.MainActivity$AsyncCaller.doInBackground(MainActivity.java:205) 
                         at ***********.myapplication.MainActivity$AsyncCaller.doInBackground(MainActivity.java:200) 
                         at android.os.AsyncTask$2.call(AsyncTask.java:295) 
                         at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
                         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
                         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
                         at java.lang.Thread.run(Thread.java:818)  

回答

0

在這裏可以

DummyContentRegistry registry = new XMLDummyContentParser(url).parse(); 
for (DummyItem t: registry.getTeachers()) { 
addItem(t); 
} 

你做UI的一些變化(增加一些數據列出或改變它的一些數據)。您會收到異常,因爲所有使用UI的操作都應在主線程中完成,而不是在其他線程中完成。這就是爲什麼在AsyncTast中有onPostExecute方法在finify doInBackground方法後進行一些UI更改的原因