2016-06-21 105 views
0

我嘗試創建一個獲取圖像並將其緩存在內存中的類,但它不會將值返回給我的列表適配器類。當我調試時,我可以在GetImagesBitmap中看到位圖值,但在返回到ListTestAdapter後,該值爲空。任何人都可以引導我。謝謝。Android Bitmap從其他類中返回null

這是我GetImagesBitmap類將返回值ListTestAdapter

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.widget.ImageView; 

import java.net.URL; 


public class GetImagesBitmap extends AsyncTask<Void, Void, Bitmap> { 
    private final String TAG = "MY_MESSAGE"; 
    private Bitmap bitmap; 
    private String url; 

    public GetImagesBitmap() { 
    } 

    public GetImagesBitmap(String url) { 
     this.url = url; 
    } 

    @Override 
    protected Bitmap doInBackground(Void... params) { 
     Bitmap bitmap1 = (Bitmap) ImageCache.getInstance().getLru().get(url); 
     if (bitmap == null) { 
      try { 
       URL newurl = new URL(url); 
       bitmap1 = BitmapFactory.decodeStream(newurl.openConnection().getInputStream()); 
       ImageCache.getInstance().getLru().put(url, bitmap1); 
      } catch (Exception e) { 
       Log.e(TAG, e.toString()); 
      } 
     } 

     return bitmap1; 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap2) { 
     this.bitmap = bitmap2; 
    } 

    public Bitmap getBitmap() { 
     return bitmap; 
    } 
} 

ListTestAdapter.java

package com.example.chaifs.test.adapter; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.ToggleButton; 

import com.example.chaifs.test.R; 
import com.example.chaifs.test.controller.GetImagesBitmap; 
import com.example.chaifs.test.model.*; 

import java.util.List; 

public class ListTestAdapter extends BaseAdapter { 

    private final String TAG = "MY_MESSAGE"; 
    private List<Test> mItems; 
    private LayoutInflater mInflater; 

    public ListTestAdapter(Context context, List<Test> listTest) { 
     this.setItems(listTest); 
     this.mInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return (getItems() != null && !getItems().isEmpty()) ? getItems().size() : 0; 
    } 

    @Override 
    public Test getItem(int position) { 
     return (getItems() != null && !getItems().isEmpty()) ? getItems().get(position) : null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return (getItems() != null && !getItems().isEmpty()) ? getItems().get(position).getId() : position; 
    } 

    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     final ViewHolder holder; 
     View v = convertView; 
     if (v == null) { 
      v = mInflater.inflate(R.layout.list_test, parent, false); 
      holder = new ViewHolder(); 
      holder.imgView = (ImageView) v.findViewById(R.id.imgView); 
      holder.txtId = (TextView) v.findViewById(R.id.txt_id); 
      holder.button1 = (ToggleButton) v.findViewById(R.id.tgl_status); 
      holder.button1.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        ((ListView) parent).performItemClick(v, position, 0); 
       } 
      }); 
      v.setTag(holder); 
     } else { 
      holder = (ViewHolder) v.getTag(); 
     } 

     // fill row data 
     Test currentItem = getItem(position); 
     if (currentItem != null) { 
      holder.txtId.setText(currentItem.getId().toString()); 
      holder.button1.setChecked(currentItem.getBookmarkStatus().equals("true") ? true : false); 

      //this part which cannot get the bitmap return value 
      GetImagesBitmap getImagesBitmap = new GetImagesBitmap(currentItem.getImageURL()); 
      getImagesBitmap.execute(); 
      Bitmap bitmap = getImagesBitmap.getBitmap(); 
      Log.e(TAG, "size of bitmap" + String.valueOf(bitmap.getByteCount())); 
      holder.imgView.setImageBitmap(bitmap); 

     } 
     return v; 
    } 

    public List<Test> getItems() { 
     return mItems; 
    } 

    public void setItems(List<Test> mItems) { 
     this.mItems = mItems; 
    } 

    class ViewHolder { 
     ImageView imgView; 
     TextView txtId; 
     ToggleButton button1; 

    } 

} 
+0

如果正在從互聯網加載圖片,然後使用畢加索圖書館。 –

回答

0

的問題是,你不等待AysncTask完成。這裏就是你有

//this part which cannot get the bitmap return value 
GetImagesBitmap getImagesBitmap = new GetImagesBitmap(currentItem.getImageURL()); 
getImagesBitmap.execute(); 
Bitmap bitmap = getImagesBitmap.getBitmap(); 

但execute()調用是無阻塞所以它會立即返回,這意味着你的形象尚未取出。

+0

搜索了半小時,但沒有找到解決方案。那麼,如何等待AysncTask完成?你可以幫我嗎。謝謝。 – user2983387

+0

這是一個令人驚訝的難題。我建議使用像畢加索這樣的圖書館。 – CaseyB

0

你用來從服務器獲取位圖的方式有點不對。

 //this part which cannot get the bitmap return value 
     GetImagesBitmap getImagesBitmap = new GetImagesBitmap(currentItem.getImageURL()); 
     getImagesBitmap.execute(); 
     Bitmap bitmap = getImagesBitmap.getBitmap(); 
     Log.e(TAG, "size of bitmap" + String.valueOf(bitmap.getByteCount())); 
     holder.imgView.setImageBitmap(bitmap); 

好了在這裏你是一個網絡調用來從服務器位圖,並在下一行你所要求的位圖。 Asynchtask運行在不同的線程上,所以最好使用回調函數,以便只要下載完成,它就會通過回調函數通知您。