在onPostExecute中运行新的网络请求

时间:2014-09-23 16:33:08

标签: java android multithreading

onPostExecute内运行http请求的最佳方法是什么?

我尝试执行的行是:

Bitmap bmp = BitmapFactory.decodeStream(new URL(imgData[i][0]).openStream());

但是,它会抛出networkOnMainThreadException,但我需要它在onPostExecute部分运行。这样做的最佳方式是什么?

我需要它来访问主线程上的UI,因为这是该部分的样子:

单击某个项目时,您可以看到它为其添加意图的代码块,它需要访问最初创建它以启动Web浏览器的主线程。

否则会弹出错误:Only the original thread that created a view hierarchy can touch its views

for (int i = 0; i < 3; i++) {

   try {
       // set the URL of the image

       iv.setURL(imgData[i][1]);
       if (imgData[i][0] == null) {
            imgData[i][0] = "http://website..co.uk/images/url.jpg";
       }
       Bitmap bmp = BitmapFactory.decodeStream(new URL(imgData[i][0]).openStream());
       iv.setImageBitmap(bmp);

       iv.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {

               Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(iv.getURL()));
               startActivity(browserIntent);
          }
       });

      } catch (Exception e) {
            e.printStackTrace();
     }
}

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

public class MyAsyncTask extends AsyncTask<Void, Void, List<Bitmap>> {

    @Override
    protected List<Bitmap> doInBackground(Void... params) {
        // code load the images ...

        List<Bitmap> result = new ArrayList<Bitmap>();

        for (int i = 0; i < 3; i++) {

            try {
                // set the URL of the image
                iv.setURL(imgData[i][1]);
                if (imgData[i][0] == null) {
                    imgData[i][0] = "http://website..co.uk/images/url.jpg";
                }
                Bitmap bmp = BitmapFactory.decodeStream(new URL(imgData[i][0]).openStream());
                result.add(bmp);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return result;
    }

    @Override
    protected void onPostExecute(List<Bitmap> params) {
        for (int i = 0; i < 3; i++) {
            iv.setImageBitmap(bmp);

            iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(iv.getURL()));
                    startActivity(browserIntent);
                }
            });
        }
    }
}

这将在后台线程中加载图像并在ui线程中设置图像位图。