我想从服务器中下载图片后并显示出来,当进行下载时,会显示一个进度对话框。使用一个 asynctask 类。运用下面的代码:
private void startDownload() {
new DownloadFileAsync().execute(imageUrl);
image.setImageBitmap(bitmap);
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DOWNLOAD_PROGRESS:
dialog = new ProgressDialog(this);
dialog.setTitle("Loading");
dialog.setMessage("Please wait...");
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setCancelable(false);
dialog.show();
return dialog;
default:
return null;
}
}
class DownloadFileAsync extends AsyncTask<String, String, String> {
int count;
URL myFileUrl;
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
@Override
protected String doInBackground(String... aurl) {
try {
myFileUrl = new URL(imageUrl);
HttpURLConnection conn = (HttpURLConnection) myFileUrl
.openConnection();
int lenghtOfFile = conn.getContentLength();
//conn.setDoInput(true);
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
conn.connect();
InputStream is = conn.getInputStream();
bmImg = BitmapFactory.decodeStream(is);
bitmap = BitmapFactory.decodeStream((InputStream) new URL(imageUrl)
.getContent());
bitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true);
byte data[] = new byte[1024];
System.out.println("mmmmmmmmmmmm");
long total = 0;
System.out.println("nnnnnnnnnn");
while ((count = ((InputStream) new URL(imageUrl)
.getContent()).read(data)) != -1) {
total += count;
publishProgress(""+(int)((total*100)/lenghtOfFile));
for(int l=0;l<4;l++){
if(listObject.get(l).getImage()!="")
image.setImageBitmap(bitmap);
}}
}
catch(Exception e){
System.out.println(e);}
return null;
}
protected void onProgressUpdate(String... progress) {
dialog.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String unused) {
image.setImageBitmap(bitmap);
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}
}
却给出下面的异常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
我找不出错误所在,请大家帮忙改正。
继承自AsyncTask,注意AsyncTask最后的最后一个类型为Bitmap,然后 protected Bitmap doInBackground(String... aurl)函数返回获得的图片,
最后在
@Override protected void onPostExecute(Bitmap image) {
image.setImageBitmap(image);
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}
,
还有image.setImageBitmap()不能放到doInBackground()中,因为doInBackground()不是运行在主线程。
image.setImageBitmap()
不能放到doInBackground()
中,因为doInBackground()
不是运行在主线程中的。