【问题标题】:error occured while executing doInBackground()执行 doInBackground() 时发生错误
【发布时间】:2011-05-23 07:47:34
【问题描述】:

我想从服务器异步加载图像但是当我运行它时强制关闭......并在日志猫上给出消息......执行doInBackground()时发生错误......有什么问题请帮助我......麻烦请

public class artspacedetailShowingNow extends Activity implements OnClickListener {
    private int imageCounter = 0;

    private ProgressDialog bar;

    private ImageView imageLoader;
    private String[] imageList = {"http://www.artealdiaonline.com/var/artealdia_com/storage/images/argentina/directorio/galerias/ruth_benzacar/artistas/martin_di_girolamo._diosas/198915-1-esl-AR/MARTIN_DI_GIROLAMO._Diosas.jpg","http://www.artealdiaonline.com/var/artealdia_com/storage/images/argentina/directorio/galerias/ruth_benzacar/artistas/jorge_macchi._la_espera/198929-1-esl-AR/JORGE_MACCHI._La_espera.jpg","http://www.artealdiaonline.com/var/artealdia_com/storage/images/argentina/directorio/galerias/ruth_benzacar/artistas/leon_ferrari._hongo_nuclear/198950-1-esl-AR/LEON_FERRARI._Hongo_Nuclear.jpg","http://www.artealdiaonline.com/var/artealdia_com/storage/images/argentina/directorio/galerias/ruth_benzacar/artistas/martin_sastre._fiebre/198922-1-esl-AR/MARTIN_SASTRE._Fiebre.jpg"};
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.showingnow);
           imageLoader = (ImageView) findViewById(R.id.imageLoader);
        //imageLoader.setImageResource(image1);

        Button next = (Button) findViewById(R.id.next);
        Button back = (Button) findViewById(R.id.back);
        next.setOnClickListener(this);
        back.setOnClickListener(this);
        back.setEnabled(false);

        new ImageDownload().execute(imageList[imageCounter]); 


    }
@Override
 public void onClick(View v)
{
    String imagePath = null;
       // imagePath = imageList[imageCounter];


    }
    new ImageDownload().execute(imagePath);



}
private void loadImage(String imagePath)

{
      try {

          /* Open a new URL and get the InputStream to load data from it. */

          URL aURL = new URL(imagePath);
          URLConnection conn = aURL.openConnection();
          conn.connect();
          InputStream is = conn.getInputStream();

          /* Buffered is always good for a performance plus. */
          BufferedInputStream bis = new BufferedInputStream(is);

          /* Decode url-data to a bitmap. */
          Bitmap bm = BitmapFactory.decodeStream(bis);

          bis.close();
          is.close();
         imageLoader.setImageBitmap(bm);
         imageLoader.setImageBitmap(bm);
      } catch (IOException e) 
      {

          Log.e("DEBUGTAG", "Remote Image Exception", e);

      }

}
private class ImageDownload extends AsyncTask<String , Void, Void>
{
    @Override
    protected Void doInBackground(String... params) {
        loadImage(params[0]);


       return null;
   }


    @Override
    protected void onPostExecute(Void result) {


    }
    @Override
    protected void onPreExecute() {


    }

}
}

【问题讨论】:

  • 发生错误时的 logcat 输出(stacktrace)是什么?
  • 你能把你在 LogCat 中得到的错误信息贴出来吗?
  • 您也可以在评论您的旧问题时提出这个问题..*.com/questions/6092997/… .. 无需提出新问题...

标签: android


【解决方案1】:

试试这个

      private class ImageDownload extends AsyncTask<String , Void, Void>
{
    Bitmap imBitmap;
    @Override
    protected Void doInBackground(String... params) {
         try {

              /* Open a new URL and get the InputStream to load data from it. */

              URL aURL = new URL(params[0]);
              URLConnection conn = aURL.openConnection();
              conn.connect();
              InputStream is = conn.getInputStream();

              /* Buffered is always good for a performance plus. */
              BufferedInputStream bis = new BufferedInputStream(is);

              /* Decode url-data to a bitmap. */
              Bitmap bm = BitmapFactory.decodeStream(bis);
              imBitmap=bm;
              bis.close();
              is.close();

          } catch (IOException e) 
          {

              Log.e("DEBUGTAG", "Remote Image Exception", e);

          }


       return null;
   }


    @Override
    protected void onPostExecute(Void result) {
    imageLoader.setImageBitmap(imBitmap);
                 imageLoader.setImageBitmap(imBitmap);

    }
    @Override
    protected void onPreExecute() {


    }

}

你不能在 doinBackground 中使用imageLoader.setImageBitmap(imBitmap);

【讨论】:

  • 当您决定哪个答案对您最有帮助时,通过单击答案左侧的复选框轮廓将其标记为已接受的答案。这可以让其他人知道您的问题得到了很好的回答。这样做很有帮助,因为它向其他人表明你从社区中获得了价值。 (如果您不这样做,人们通常会礼貌地要求您返回并接受更多问题的答案!)
【解决方案2】:

您看起来像是从 doInBackground 中访问您的 ImageView。这是不允许的。

只能在 UI 线程中操作 UI 元素。

如果您阅读AsyncTask,您会看到doInBackground 在另一个线程中执行,而onPreExecute、onProgressUpdate 和onPostExecute 在UI 线程中执行。

在我上面提到的方法中处理 UI 元素,或者像 TofferJ 建议的那样发布一个可运行的。

【讨论】:

    【解决方案3】:

    在执行影响 UI 的操作时,您需要使用 UI 线程。取决于后台线程的启动位置:

    runOnUiThread(new Runnable() {
    
        @Override
        public void run() {
            imageLoader.setImageBitmap(bm);
            imageLoader.setImageBitmap(bm);
        }
    });
    

    imageLoader.post(new Runnable() {
    
        @Override
        public void run() {
            imageLoader.setImageBitmap(bm);
            imageLoader.setImageBitmap(bm);
        }
    });
    

    上面的两个 sn-ps 都将确保使用正确的线程来更新您的 UI。确保在从另一个步骤修改 UI(设置图像、更新文本等)时始终这样做,这样您就不会遇到麻烦。 :)

    【讨论】:

      最近更新 更多