Android:在后台加载图片的最佳方式

时间:2011-03-17 14:45:27

标签: android

对于我的自定义列表视图,我正在使用AsyncTask进行Web服务调用,它运行正常。 “我的列表”视图具有左侧图像,标题,说明。该服务将返回(url,title,desc)列表。

在我的适配器中,我使用以下代码加载图像:

httpClient = new DefaultHttpClient(); 
HttpGet request = new HttpGet(url);         
response = httpClient.execute(request);
InputStream is = response.getEntity().getContent();
Drawable drawable = Drawable.createFromStream(is, "src");
imgView.setImageDrawable(drawable);

但是在加载所有图片之前我无法看到列表视图,我知道我正在阻止UI线程,任何人都可以建议在没有UI阻塞的情况下执行此操作的最佳方法。

谢谢, Venkat Papana

4 个答案:

答案 0 :(得分:3)

使用AsyncTaskThreadHandler一样,上述答案已经注明。

以下是从网址获取图片资源的快捷方式:

BitmapDrawable bitmapDrawable = new BitmapDrawable(BitmapFactory.decodeStream(new URL("http://example.com/path/to/image/file.jpg").openStream()));

创建1个AsyncTask,然后在doInBackground中循环浏览所有图片网址,并将每个生成的drawable添加到图标列表或其他内容

答案 1 :(得分:2)

new Thread(new Runnable() {

                           @Override
                           public void run() {

                                       httpClient = new DefaultHttpClient(); 
                                       HttpGet request = new HttpGet(url);         
                                       response = httpClient.execute(request);
                                       InputStream is =  response.getEntity().getContent();
                                     msg.obj=is;
                                   mHandler.sendMessage(msg);
                           }
                   }).start();

你的句柄就像这样

mHandler = new Handler() { 
              @Override public void handleMessage(Message msg) { 
                 InputStream is=(InputStream)msg.obj;
                 Drawable drawable = Drawable.createFromStream(is, "src");
                 imgView.setImageDrawable(drawable);

              }
          };

答案 2 :(得分:1)

也可以使用AsyncTask进行图像加载。对于每个加载的图片,您可以从publishResults()拨打doInBackground(),然后让onProgressUpdate()将图片放在正确的位置。

答案 3 :(得分:0)

这是更好的尝试方法..这适用于cardview中的图像加载

private class LoadImage extends AsyncTask<String, String, Bitmap> {
    Bitmap bitmap1 = null;
    CurrentVehicleStatus currentVehicleStatus;

    int i;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Stuff on preexecute

        pDialog = new ProgressDialog(AdminActivity.this);
        pDialog.setTitle("Please wait");
        pDialog.setMessage("Loading data..");
        pDialog.show();

    }
    protected Bitmap doInBackground(String... args) {

           for(int i=0;i<arrayLength;i++) {
          //Your class reference that store your values for adapter
          yourClassReference = yourArrayList.get(i);

            try {
                bitmap = BitmapFactory.decodeStream((InputStream) new URL("Your URL"
                ).getContent());

            } catch (Exception e) {
                e.printStackTrace();
            }
    //this setImage method in data class
      yourArrayList.get(i).setImage(bitmap);

         }

        }


        return bitmap1;
    }

    protected void onPostExecute(Bitmap image) {

        pDialog.dismiss();
    //Notify adapter
        mAdapter.notifyDataSetChanged();

    }
}

有任何疑问评论我