如果我在任何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