如果我在任何Activity中並且我想下載一個文件(使用線程)並且同時我希望主線程等待下載完成,我該怎麼辦? ?Android:如何在下載完成後恢復主線程
回答
使用AsyncTask ..從活動
new DownloadTask(this).execute();
任務,例如:
public class DownloadTask extends AsyncTask<Void, Void, String> {
private ProgressDialog progressDialog;
private Context context;
/**
*
* @param context
* @param pdfDoc the document of the PDF
*/
public DownloadTask(Context context) {
this.context = context;
progressDialog = new ProgressDialog(context);
}
@Override
protected void onPreExecute() {
progressDialog.setMessage("Downloading...");
progressDialog.setIndeterminate(true);
progressDialog.show();
}
@Override
protected String doInBackground(Void... arg0) {
//download here
}
@Override
protected void onPostExecute(final String result) {
progressDialog.dismiss();
}
}
使用的AsyncTask和回調。如果你想線程與他主線程溝通,告訴下載完成後,使用handler 這個代碼將有助於
downloadString("http://www.route.to.your.string.com", new DownloadCallback<String>(){
public void onFinishDownloading(String downloadedResult){
Toast.makeText(YourActivityName.this, downloadedResult, Toast.LENGTH_SHORT).show();
}
});
通過這種方法,您甚至可以在其他下載任務中重複使用其他結果類型的回調函數;-) – razielsarafan
這樣主線程就等待完成下載了嗎? – GVillani82
這樣: A)主線程執行onExExcute,然後休眠。 B)新線程執行doInBackground。主線程沒有被堵塞,同時,你可以做任何你想要的。 C)主線程喚醒並執行onPostExecute。 – razielsarafan
:
public interface DownloadCallback<T>{
public void onFinishDownload(T downloadedResult);
}
public static void downloadString(String url, DownloadCallback<String> callback){
new AsyncTask<Void,Void,Void>(){
String result;
@Override
protected void onPreExecute() {
// Do things before downloading on UI Thread
}
@Override
protected String doInBackground(Void... arg0) {
//download here
result = download(url);
}
@Override
protected void onPostExecute(final Void result) {
// Do things on UI thread after downloading, then execute your callback
if (callback != null) callback.onFinishDownloading(result);
}
}.execute();
}
,並利用這一點,你只是這樣做你瞭解它
MyHnadler handler;
onCreate(Bundle savedInstance)
{
setContent..
...
handler=new MyHandler();
new MyThread().start();
}
public class MyHandler extends Handler
{
@Override
public void handleMessage(Message message) {
switch (message.what) {
case 1: //....threading over
//write your code here
break;
case2 : //if you want to be notiifed of something else
..
}
public class MyThread extends Thread
{
@Override
public void run()
{
//run the threa
//and when over
Message msg=handler.getMessage();
msg.what=1;
handler.sendMessage(msg); //send the message to handler
}
}
}
正如你可以看到線程交通技術通過處理程序通過UI線程處理。在上面的例子中,我只將任何對象從線程發送到UI線程。要做到這一點,只需在線程中執行msg.obj=your_obj
。它可以是任何對象。希望這可以幫助你:)
- 1. 如何在iCloud恢復後恢復下載的媒體文件?
- 2. AsyncTask完成後主線程崩潰
- 3. 主題:如何在線程完成後重新啓動?
- 4. 如何恢復Perl下載?
- 5. 如何確保一個線程在其主線程完成後執行?
- 6. Android - 當我的應用完成後恢復後臺應用
- 7. 恢復下載
- 8. 斯卡拉 - 多線程,當任何子線程完成時完成主線程
- 9. 安卓主線程完成
- 10. Android:線程完成後使用setContentView()
- 11. 線程完成時通知主線程
- 12. 應用程序在用戶關閉後報亭恢復下載完全
- 13. 如何在線程完成後清理線程?
- 14. 如何下載和主線程
- 15. 在Android中暫停和恢復線程
- 16. 下載管理器Android:下載完成
- 17. 如何讓主線程等待所有子線程完成?
- 18. Android:如果主線程在工作線程之前完成,會發生什麼?
- 19. 如何從Android下載管理器完成所有下載後通知
- 20. Android 2.1+撥入/撥出電話暫停,完成後恢復
- 21. 完成後可以恢復Android活動嗎?
- 22. Android完成活動,然後恢復活動父項
- 23. 如何恢復在asynctask離開的下載android
- 24. 如何使用okhttp在Android中暫停/恢復下載
- 25. 在Phpseclib中恢復下載
- 26. NPM恢復在下載包
- 27. Android ::在主線程中執行其他任務之前阻止主線程完成主線程
- 28. 在完成下載後,在後臺加載顯示在Android中的IMgage在
- 29. youtube-dl - 錯誤後恢復下載
- 30. 超時後恢復FTP下載
要進一步添加,你的主線程不應該完全鎖定,而它等待。假設用戶將使用Activity上的其他元素,甚至在下載完成之前終止它。使用上面的示例Async將允許這樣做。 –
我無法在下載之前創建我的活動。 – GVillani82