我有asynktask,显示progressDialog并在doInBackground方法中更新其值。方法代码:
@Override
protected void onPreExecute() {
progress = new ProgressDialog(cont);
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progress.setIndeterminate(true);
progress.setTitle(cont.getResources().getString(R.string.pleaseWait));
progress.setMessage(cont.getResources().getString(R.string.loadingImages));
progress.show();
super.onPreExecute();
}
@Override
protected String doInBackground(Void... arg0) {
progress.setProgress(2);
//do some work on the database and network
progress.setProgress(25);
//Do some extra work
for(int i = 0; i < itemImagesList.size(); i++){
publishProgress((int) ((i / (float) itemImagesList.size()) * 100));
//Do somework
}
}
@Override
protected void onProgressUpdate(Integer... prog) {
progress.setProgress(prog[0]);
}
@Override
protected void onPostExecute(String result) {
progress.dismiss();
super.onPostExecute(result);
}
progressDialog值根本没有变化!如果我尝试使用以下方式设置对话框消息:
progress.setMessage("At item "+i);
如果我把它放在方法的中间会发生一些异常,但是在第一次它工作正常!
出了什么问题?
答案 0 :(得分:13)
您的问题与setIndeterminate(true);
有关如果您想要更新进度(请查看Android setProgress doc),请将其设置为false
,不要忘记也使用{ {1}}将进度最大值设置为所需的值。
正如Laurent所说,你只能在UI线程上改变进度,所以你必须在setMax()
中而不是在doInBackground中进行
答案 1 :(得分:2)
您必须更新UI线程内的进度值,以便在AsyncTasK的onProgressUpdate方法中
答案 2 :(得分:1)
这样做
@Override
protected String doInBackground(Void... arg0) {
getActivity ().runOnUiThread (new Runnable() {
@Override
public void run () {
progress.setProgress(2);
//do some work on the database and network
progress.setProgress(25);
}
});
//Do some extra work
for(int i = 0; i < itemImagesList.size(); i++){
publishProgress((int) ((i / (float) itemImagesList.size()) * 100));
//Do somework
}
}