这是我的AsyncTask类:
private class Task extends AsyncTask<Void, Integer, Void> {
@Override protected void onPreExecute() {
dia = new ProgressDialog(pictures.this);
dia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dia.setMessage("Please wait while content is loaded...");
dia.setCancelable(false);
dia.show();
}
@Override protected Void doInBackground(Void... voids) {
Thread thread = new Thread(null, uploader, "MagentoBackground");
thread.start();
//publishProgress(100); keep this commented or no?
return null;
}
@Override public void onProgressUpdate(Integer... prog) {
if (prog == null)
return;
dia.setProgress(prog[0]);
}
@Override protected void onPostExecute(Void voids) {
dia.setMessage("Done");
dia.cancel();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
我现在关注的是一个主要问题和一个小问题。以下是主要和次要问题:
此应用程序的目的是拍照并将其上传到网站。一旦用户点击“确定”按钮上传,AsyncTask对话框就会显示,所以这很好。但是,它仅显示已经100%完成的瞬间对话框,然后强制关闭。但是,它肯定不是100%完成!当我查看网站并刷新页面时,它不会显示图片。 (在WiFi上,图片实际上会立即上传,当网站立即刷新时,它会显示新图片。但在3G上,此过程可能需要几分钟 - 这就是为什么我希望用户看到进度照片正在上传)。
我不确定如何使用onProgressUpdate
。我试过几个教程,但没有用。如果有人能说出我能为这种情况做些什么,那将会很有帮助
修改
Runnable
代码:
private Runnable uploader = new Runnable() {
@Override
public void run() {
/**JER 3**/
if (teacherInfo != null)
teacher = " - " + teacherInfo ;
else teacher = "" ;
if (schoolInfo != null )
school = " - " + schoolInfo ;
else school = "" ;
/********/
if(Descriptor.desString.equals("")) Descriptor.desString = "No description provided.";
int sessionId = rapi.createSession(experimentInput.getText().toString(),
name.getText().toString() + teacher + school + " - " + time,
Descriptor.desString, "n/a", "Lowell, MA", "");
JSONArray dataJSON = new JSONArray();
JSONArray subData = new JSONArray();
try {
subData.put(curTime); subData.put(Lat); subData.put(Long); subData.put(Descriptor.desString);
dataJSON.put(subData);
}
catch (JSONException e) {
e.printStackTrace();
}
Boolean result = rapi.updateSessionData(sessionId, experimentInput.getText().toString(), dataJSON);
if (result) {
rapi.uploadPictureToSession(picture, experimentInput.getText().toString(),
sessionId, name.getText().toString() + teacher + school + " - " + time,
name.getText().toString() + Descriptor.desString);
}
//if (m_ProgressDialog != null && m_ProgressDialog.isShowing()) m_ProgressDialog.dismiss();
}
};
答案 0 :(得分:4)
您正在已经分离的线程中启动一个新线程。
doInBackground()
在不同的线程中执行,然后是AsyncTask类的UI方法onPreExecute()
,onPostExecute()
和onProgressUpdate()
。你的异步任务所做的就是启动第三个线程。这几乎没有时间。之后,您的任务完成,导致对话框立即关闭。
您可以在doInBackground()
内进行上传,无需在那里开始新的主题。这就是AsyncTask
班为你做的事。
关于进度:每次执行onProgressUpdate()
时都会调用publishProgress()
。因此,这是正确实现的,您只需在上传过程中多次致电publishProgress()
以相应地更新进度条(例如,每次发送的百分比)。