首页 文章

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

提问于
浏览
2

对于我的自定义列表视图,我正在使用AsyncTask进行Web服务调用,它工作正常 . “我的列表”视图具有左侧图像, Headers ,说明 . 该服务将返回(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 回答

  • 1

    如上面的答案所述,使用 AsyncTaskThreadHandler .

    以下是从URL获取图像资源的快速方法:

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

    创建1 AsyncTask ,并在 doInBackground 中循环遍历所有图像URL并将每个生成的drawable添加到图标列表或其他内容

  • 3
    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);
    
                  }
              };
    
  • 0

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

  • 2

    这是更好的尝试方法..这是用于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();
    
        }
    }
    

    有任何疑问评论我

相关问题