У меня AsyncTask, который загружает изображение, а также показывает диалог прогресса. Асинхронная программа работает очень хорошо, и прогресс загрузки изображения также показывает значение правильно. Я проверил его, зарегистрировав значение загрузки в doInBackground(), а затем использовал publishProgress(). Но этот publishProgress не увеличит bar progressdialog.Asynctask не обновляет диалог прогресса с publishprogress
Ниже приведен код, который я использую.
public class SingleMenuItemActivity extends Activity {
public static final String KEY_TITLE = "title";
public static final String KEY_LINK = "link";
public static final String KEY_DATE = "date";
public static final String TAG = "SingleMenuItemActivity";
private ProgressDialog pDialog;
// Progress dialog type (0 - for Horizontal progress bar)
public static final int PROGRESS_BAR_TYPE = 0;
//public static ImageDownloadTask imTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.single_list_item);
// getting intent data
Intent in = getIntent();
// Get XML values from previous intent
String name = in.getStringExtra(KEY_TITLE);
String pLink = in.getStringExtra(KEY_LINK);
String pDate = in.getStringExtra(KEY_DATE);
// Displaying all values on the screen
TextView lblTitle = (TextView) findViewById(R.id.title_label);
TextView lblDate = (TextView) findViewById(R.id.publish_label);
lblTitle.setText(name);
lblDate.setText(pDate);
// Set Image
try {
URL url = new URL(pLink);
new ImageDownloadTask().execute(url);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Showing Dialog
* */
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case PROGRESS_BAR_TYPE: // we set this to 0
pDialog = new ProgressDialog(this);
pDialog.setMessage("Downloading image. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setMax(100);
pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pDialog.setCancelable(false);
pDialog.show();
return pDialog;
default:
return null;
}
}
class ImageDownloadTask extends AsyncTask<URL, Float, String> {
public static final String TAG = "ImageDownloadTask";
ImageView imageView = (ImageView) findViewById(R.id.single_list_imageview);
int count;
@Override
protected String doInBackground(URL... params) {
try {
URL url = params[0];
URLConnection conection = url.openConnection();
conection.connect();
// this will be useful so that you can show a tipical 0-100% progress bar
int lenghtOfFile = conection.getContentLength();
// download the file
InputStream input = new BufferedInputStream(url.openStream(), 8192);
// Output stream
OutputStream output = new FileOutputStream("/sdcard/downloadedfile.jpg");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
float pValue = (float)((total*100)/lenghtOfFile);
Log.d(TAG,"Download so far : "+pValue);
// publishing the progress....
// After this onProgressUpdate will be called
publishProgress(pValue);
// writing data to file
output.write(data, 0, count);
}
// flushing output
output.flush();
// closing streams
output.close();
input.close();
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String result) {
Log.d(TAG,"Bitmap download complete");
dismissDialog(PROGRESS_BAR_TYPE);
// Displaying downloaded image into image view
// Reading image path from sdcard
String imagePath = Environment.getExternalStorageDirectory().toString() + "/downloadedfile.jpg";
// setting downloaded into image view
imageView.setImageDrawable(Drawable.createFromPath(imagePath));
}
@Override
protected void onCancelled(){
Log.d(TAG,"Progress Dialog was Cancelled");
pDialog.dismiss();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// Things to be done before execution of long running operation. For
// example showing ProgessDialog
showDialog(PROGRESS_BAR_TYPE);
}
protected void onProgressUpdate(Integer... values) {
//super.onProgressUpdate(values);
Log.d(TAG,"values"+values[0]);
// incrementProgressBy(values[0]);
//pDialog.setProgress(values[0]);
setProgress(values[0]);
}
}
}
Скажите, пожалуйста, где я делаю это неправильно.
Спасибо,
Вы должны вызвать setProgress() в самом диалоге, и, между прочим, уверены ли вы, что вы правильно вычисляете ход? – Egor
Да pValue рассчитывается по желанию. и показано, как следует в окне просмотра LogCat Скачать до сих пор: 99,0 Скачать до сих пор: 99,0 Скачать до сих пор: 100,0 И я также попробовал уже pDialog.setProgress (значения [0]); Но все же диалог прогресса не будет увеличиваться. Есть ли что-то, что я могу потерять. – Samundra