ssummeraw 于 2013.04.08 16:55 提问
- 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.
我找不出错误所在,请大家帮忙改正。
-
- bboyfeiyu 2013.04.08 20:51
- 已采纳
继承自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()不是运行在主线程。
-
- suannai0314 帮你编辑了下代码的格式,更多markdown的使用见http://ask.csdn.net/pages/markdown
- 大约 5 年之前 回复
-
- usniyo 2013.04.08 17:10
image.setImageBitmap()
不能放到doInBackground()
中,因为doInBackground()
不是运行在主线程中的。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
- 其他相关推荐