progressdialog-android.view.ViewRoot$CalledFromWrongThreadException 异常

问题描述

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

progressdialog-android.view.ViewRoot$CalledFromWrongThreadException 异常的相关文章

E/错误(3907): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the o

       最近在做一个Android客户端,和Struts2搭建的服务器之间的通信,采用HTTP通信,以前做的都是简单的Android客户端,没有什么特别耗时的操作,所以这次就在Android中的耗时程序头疼,于是通过查看资料就开通了子线程,但是在子线程中却抛出异常:android.view.ViewRootImpl$CalledFromWrongThreadException.        一般在Android程序中,为了控制UI线程,都会控制主线程的时间,一般是5秒,因为我开通了子线程

android.view.inflateexception binary xml file line 异常的解决方法

有时候一个很简单的xml布局文件,运行却抛出以下异常: 07-25 10:40:50.966: D/AndroidRuntime(31570): Shutting down VM07-25 10:40:50.966: W/dalvikvm(31570): threadid=1: thread exiting with uncaught exception (group=0x42441700)07-25 10:40:50.976: E/AndroidRuntime(31570): FATAL EX

Android实现捕获未知异常并提交给服务器的方法_Android

本文实例讲述了Android实现捕获未知异常并提交给服务器的方法.分享给大家供大家参考,具体如下: 在Android应用中,即便应用已经投放市场,但有时也会遇到一些未知的异常,此时如果能够获得用户的反馈信息,那么对于我们应用的开发是一个很好的帮助 为了实现这样的效果,我们需要做如下工作 写一个类实现UncaughtExceptionHandler接口,重写uncaughtException方法 功能描述:当应用出现了未知异常,应用强制退出,应用再次启动时,提示用户是否将错误信息反馈给开发者 pu

Android实现捕获未知异常并提交给服务器的方法

本文实例讲述了Android实现捕获未知异常并提交给服务器的方法.分享给大家供大家参考,具体如下: 在Android应用中,即便应用已经投放市场,但有时也会遇到一些未知的异常,此时如果能够获得用户的反馈信息,那么对于我们应用的开发是一个很好的帮助 为了实现这样的效果,我们需要做如下工作 写一个类实现UncaughtExceptionHandler接口,重写uncaughtException方法 功能描述:当应用出现了未知异常,应用强制退出,应用再次启动时,提示用户是否将错误信息反馈给开发者 pu

android httpclient处理网络异常

问题描述 android httpclient处理网络异常 如题,如何设置网络超时,或网络异常,并且提示用户异常,哪位大侠,给个详细代码,感激不进 解决方案 转载自: ? ? ? ? ? ??http://android.tgbus.com/Android/tutorial/201108/364645.shtml ? (Android开发实现HttpClient工具类) ? ? ? ? ??http://www.open-open.com/lib/view/open1329101420890.h

Android UncaughtExceptionHandler进行全局异常捕获

        在实际开发过程中,我们的APP由于各种原因,难免会有Crash现象(应用程序XXX已经停止).这样给用户一种很不友好的感觉,那么我们如何去处理这种情况呢?答案就在实现UncaughtchExceptionHanlder,复写uncaughtException()方法.         当crash发生的时候,系统会调用UncaughtchExceptionHanlder#uncaughtException().在uncaughtException()中我们可以选择收集错误信息,然

深入理解Android View(转)

  做android其实也有一段时间了,我们每个人都会碰到一些这样或那样的问题,碰到问题了就拼命百度,可是发现,我们解决问题的能力并没有提升很多,所以我才有想总结一下我项目中所用过的相关知识,并了解一下Android源代码中是如何定义这些属性的,如何去实现的.以后再碰到类似的问题,我该如何实现.本人也不常写博客,希望各位博友能指点,分享,并提出博客中不正确的地方,共勉!    首先我发一份我做的关于Android View深入实现的的XMind的思维导图,可以帮助我一起整理思路,若是博友有什么想

Android View系统分析之二View与ViewGroup,androidviewgroup

Android View系统分析之二View与ViewGroup,androidviewgroup 目录 在Android View系统分析之从setContentView说开来(一)一文中,我们从setContentView开始阐述了Android中的视图层次,从设置内容布局到整个视图层次的建立的过程.并且对View和ViewGroup的关系进行了简单的介绍,今天我们继续来深入的了解Android中的View和ViewGroup. ViewGroup与View的关系 我们在定义一个布局时,在它

android中出现ActivityNotFoundException异常

问题描述 android中出现ActivityNotFoundException异常 自己编的程序出现了异常数值总传不过去是怎么回事? String num=editText.getText().toString(); num=num.trim(); Intent numIntent=new Intent(); numIntent.putExtra("num",num); startActivityForResult(numIntent,NUMVALUE); 这个是按钮的监听事件. c