2016-06-21 5 views
0

Ich versuche, eine Klasse zu erstellen, die Image abrufen und im Arbeitsspeicher zwischenspeichern, aber es gibt keinen Wert an meine List-Adapter-Klasse zurück. Beim Debuggen kann ich den Bitmap-Wert in GetImagesBitmap sehen, aber nach der Rückkehr zu ListTestAdapter ist der Wert null. Kann mir bitte jemand helfen? Vielen Dank.Android Bitmap gibt null von anderer Klasse zurück

Das ist mein GetImagesBitmap Klasse, die Wert auf 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

Wenn Bilder aus dem Internet geladen werden, verwenden Sie die Picasso-Bibliothek. –

Antwort

0

Das Problem zurückkehren wird ist, dass Sie warten nicht auf die AysncTask abzuschließen. Hier ist, was Sie

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

haben aber die execute() Aufruf ist non-blocking, so gibt sie sofort, was bedeutet, dass Ihr Bild noch nicht abgeholt worden.

+0

Gesucht halbe Stunde und hat noch keine Lösung gefunden. Wie kann ich warten, bis die AysncTask abgeschlossen ist? Kannst du mir helfen. Vielen Dank. – user2983387

+0

Es ist ein überraschend schwieriges Problem. Ich würde empfehlen, eine Bibliothek wie Picasso zu verwenden. – CaseyB

0

Die Art, wie Sie Bitmap vom Server holen, ist etwas falsch.

 //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); 

Okay, hier Sie machen einen Netzanruf ein Bitmap vom Server, und in der nächsten Zeile holen Sie Bitmap fragen. Asynchtask läuft auf einem anderen Thread, also verwenden Sie besser Callback, so dass Sie immer, wenn Ihr Download abgeschlossen wird, Sie durch Rückrufe informieren wird.

Verwandte Themen