2 ssummeraw 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. 

我找不出错误所在,请大家帮忙改正。

2个回答

bboyfeiyu
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
suannai0314 帮你编辑了下代码的格式,更多markdown的使用见http://ask.csdn.net/pages/markdown
4 年多之前 回复
usniyo
usniyo   2013.04.08 17:10

image.setImageBitmap()不能放到doInBackground()中,因为doInBackground()不是运行在主线程中的。

Csdn user default icon
上传中...
上传图片
插入图片