2013-12-18 246 views
4

我想了解在Android上使用AsyncTask并为此目的,我开发了这个简单的代码。AsyncTask not calling onProgressUpdate,onPostExecute

令人惊讶的是,doInbackground被正确调用,我看到日志但其他两个方法没有被调用。

我错过了什么吗?

感谢advancde

public class DownloadFilesTask extends AsyncTask<Void, Void, Void> { 

     protected Void doInBackground(Void... params) { 
      try { 
       Log.i("Thread","1"); 
       Thread.sleep(1000); 
       Log.i("Thread","2"); 
       Thread.sleep(1000); 
       Log.i("Thread","3"); 
       Thread.sleep(1000); 
       Log.i("Thread","4"); 
       Thread.sleep(1000); 
       Log.i("Thread","5"); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     protected void onProgressUpdate(Void... progress) { 
      Log.i("Thread","onProgress"); 
     } 

     protected void onPostExecute(Void... result) { 
      Log.i("Thread","onPosts"); 
     } 
    } 

[编辑]

有了这个代码的所有作品的权利以外的onProgressUpdate

public class DownloadFilesTask extends AsyncTask<Void, Integer, String> { 

public String doInBackground(Void... params) { 
    try { 
     int i = 0; 
     Log.i("Thread","1"); 
     Thread.sleep(1000); 
     publishProgress(i++); 
     Log.i("Thread","2"); 
     Thread.sleep(1000); 
     publishProgress(i++); 
     Log.i("Thread","3"); 
     Thread.sleep(1000); 
     Log.i("Thread","4"); 
     Thread.sleep(1000); 
     Log.i("Thread","5"); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    return "done"; 
} 

public void onProgressUpdate(int progress) { 
    Log.i("Thread","onProgress " + progress); 
} 

public void onPostExecute(String result) { 
    Log.i("Thread","onPosts " + result); 
} 

在这里,你可以看到我的logcat的截图

Log

+1

http://stackoverflow.com/a/6450407/1124160看看这个。 – damian

回答

5

方法签名是错误的。它应该看起来像:

protected void onPostExecute(Void result) { 
    Log.i("Thread","onPosts"); 
} 

此外,我建议您使用@Override注释。这样,如果您试图覆盖错误的方法,您将收到编译时错误。

编辑: 您发布onProgressUpdate的签名是错误的。它应该是:

protected void onProgressUpdate(Integer... progress){} 
+0

非常感谢您的答案和建议:)'onPostExecute'现在工作,但'保护无效onProgressUpdate(虚空进展)'没有得到执行.. – Andoxko

+0

我不能在你的代码中看到你调用publishProgress(); – Blackbelt

+0

是的,我把它写成@ A.S。在他的回答中说,我看不到进展...... – Andoxko

1

AsyncTask拥有onProgressUpdate(Void ...)方法,您可以调用每个迭代或每次在doInBackground()中通过调用publishProgress()完成进度。

参考docs更多细节

所以应该看上去像个这样的:

public class DownloadFilesTask extends AsyncTask<Void, Integer, String> { 

    protected String doInBackground(Void... params) { 
     try { 
      int i = 0; 
      Log.i("Thread","1"); 
      Thread.sleep(1000); 
      publishProgress(i++); 
      Log.i("Thread","2"); 
      Thread.sleep(1000); 
      publishProgress(i++); 
      Log.i("Thread","3"); 
      Thread.sleep(1000); 
      Log.i("Thread","4"); 
      Thread.sleep(1000); 
      Log.i("Thread","5"); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return "done"; 
    } 

    protected void onProgressUpdate(int progress) { 
     Log.i("Thread","onProgress " + progress); 
    } 

    private void onPostExecute(String result) { 
     Log.i("Thread","onPosts " + result); 
    } 
} 
+0

非常感谢你的答案和例子你的代码工作正常,但保护无效onProgressUpdate(INT进展)'没有得到执行..至少我没有看到日志.. – Andoxko

+0

你会得到所有线程日志? –

+0

这是我的logCat的快照http://postimg.org/image/jql10fsgz/我做错了什么? 'onProgressUpdate'打印在另一个线程上?我怎样才能看到它?再次感谢你 – Andoxko