【发布时间】:2015-03-08 21:27:21
【问题描述】:
这是我的应用程序的流程:
1) 用户拍照或录像
2) 媒体被保存到内部存储中
3) 路径分配给自定义对象
4) 更新 UI 以指示用户可以继续
仅当自定义对象具有图像路径或视频路径时,UI 才会更新。我刚刚开始使用AsyncTask 在后台线程中保存到内部存储,这样应用程序在保存大文件时不会挂起,但我遇到了一些问题。
我想要做的:显示ProgressDialog 直到doInBackground() 完成,然后将路径分配给我的对象,然后然后继续在主线程上更新 UI。
现在,主线程将继续,而 AsyncTask 仍在工作,并且 UI 将不会正确更新,因为路径尚未分配给对象。
我已阅读有关 AsyncTask#get() 的信息,但我不确定如何使用 ProgressDialog 来实现它。我试过了,主线程似乎没有等到结果才继续。
非常感谢任何帮助。谢谢!
我的AsyncTask:
private class SaveMediaTask extends AsyncTask<Integer, Void, String>
{
private ProgressDialog progressDialog;
private int mediaType;
public SaveMediaTask()
{
progressDialog = new ProgressDialog(getActivity(), ProgressDialog.THEME_HOLO_LIGHT);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
this.progressDialog.setTitle("Processing");
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
this.progressDialog.show();
}
protected String doInBackground(Integer... mediaType)
{
//save to internal storage and return the path
return path;
}
protected void onPostExecute(String path)
{
//by the time this runs, the UI has already tried to update itself on the main thread,
//and found that myObject does not yet have a path. Once this runs, it is too late.
myObject.setPath(path);
if (progressDialog.isShowing())
{
progressDialog.dismiss();
}
}
}
我怎么称呼它,用户离开相机后立即:
new SaveMediaTask().execute(MEDIA_TYPE_IMAGE);
//WAIT HERE AND DISPLAY PROGRESSDIALOG UNTIL TASK IS DONE
//update UI
【问题讨论】:
-
我不能真正得到你想要的,但是这个答案是正确的here 会告诉你如何构建你的异步任务,还要注意你的代码需求,我认为你不需要检查路径直接主线程,我认为异步任务有方法可以访问 ui,所以用它来检查你的对象路径,如果它真正调用 postexecute 并做你的事情,希望它有帮助
标签: java android multithreading android-asynctask