问题描述
- android.view.ViewRoot$CalledFromWrongThreadException 异常
- 我想从服务器中下载图片后并显示出来,当进行下载时,会显示一个进度对话框。使用一个 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()
不是运行在主线程中的。
时间: 2024-11-16 14:24:38