Ich versuche, Bilder in den Text neben dem Text in einer Listenansicht zu laden. Da das Scrollen ohne eine Asyntask ist schrecklich, versuche ich das zu implementieren. Leider gibt mir mein Code in onPostExecute() Nullzeigerfehler und ich kann nicht herausfinden, warum. Mein Code ist wie folgt:Laden von Bildern in Listenansicht
class LoadImage extends AsyncTask<Object, Void, Bitmap>{
private ImageView imv;
private Object imageViewHolder;
private String position;
private Object path;
public LoadImage(ImageView imv, String _position) {
Log.w("MyApp", "creating LoadImage");
this.imv = imv;
Log.w("MyApp", "got image view");
path = imv.getTag();
Log.w("MyApp", "Got Imageview Path");
position = _position;
Log.w("MyApp", "LoadImage created");
}
@Override
protected Bitmap doInBackground(Object... params) {
Log.w("MyApp", "in doInBackground");
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Log.w("MyApp", "made bitmap factory");
Bitmap bm = null;
Log.w("MyApp", "Getting URL ID");
File dir = new File(PATH + position);
Log.w("MyApp", "Have URL ID");
if(dir.isDirectory()){
Log.w("MyApp","Dir is a directory");
File header = new File(dir.getAbsolutePath() + "/title");
Log.w("MyApp", "Checking for title");
if(header.isFile()){
bm = BitmapFactory.decodeFile(header.getAbsolutePath(), options);
}
if(bm!=null){
Log.w("MyApp", "Title is good");
}else{
Context c = ReadingList.this;
bm = BitmapFactory.decodeResource(c.getResources(), R.drawable.ic_menu_gallery);
}
}else{
Log.w("MyApp", "Dir Not Directory");
Context c = ReadingList.this;
bm = BitmapFactory.decodeResource(c.getResources(), R.drawable.ic_menu_gallery);
}
return bm;
}
@Override
protected void onPostExecute(Bitmap result) {
if (!imv.getTag().equals(path)) {
Log.w("MyApp", "Not setting images");
return;
}
if(result != null && imv != null){
Log.w("MyApp", "setting bitmap");
imv.setImageBitmap(result);
}else{
Log.w("MyApp", "Nothing happened");
}
}
}
Das Problem, das ich mit bin kämpfe nicht im Stich gelassen Bitmaps zusammen mit der Recycling-Ansicht recycelt werden. Ich habe einige Beispiele auf dieser Seite angeschaut und bin mir nicht sicher, warum das nicht funktioniert. Eine Menge Code wurde aus der Antwort auf diese ausgeliehen. Der onPostExecute gibt nichts in das Protokoll ein und stürzt auch nicht sofort ab. Es dauert ungefähr zwei Minuten, um zu stürzen. Die Bilder werden von der SD-Karte gezogen, deshalb bin ich mir nicht sicher, warum es so lange dauert, um zu entscheiden, ob sie abstürzen will oder nicht.
in doInBackground
made bitmap factory
Getting URL ID
Have URL ID
Dir is a directory
Checking for title
Title is good
in doInBackground
made bitmap factory
getting URL ID
Have URL ID
Dir is a directory
Checking title
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
FATAL EXCEPTION: main
java.lang.NullPointerException
at com.theholodev.glowreader.ReadingList$LoadImage.onPostExecute(ReadingList.java:305)
at com.theholodev.glowreader.ReadingList$LoadImage.onPostExecute(ReadingList.java:1)
Es geht auf den ersten 7 Zeilen mehrmals danach zu wiederholen, aber die App abgestürzt ist und ich kann nicht sehen, ob sie alles tun. onPostExecute scheint jedoch nie wieder aufgerufen zu werden.
Zum Vergleich:
304: if (!imv.getTag().equals(path)) {
305: Log.w("MyApp", "Not setting images");
306: return;
307: }
Bitte legen Sie das Logcat, damit wir Ihnen genauer helfen können. –
Das Logcat und die referenzierten Zeilen hinzugefügt. Ich hoffe, das hilft. Nicht sicher, ob die Nullzeiger-Ausnahme ausgelöst wird. onPostExecute scheint im Bereich von imv und path zu liegen, und ich kann nicht sehen, wie entweder null wäre. –
Kommentieren Sie die Linie 305 und sehen Sie dann, was passiert ist? –