2015-11-16 57 views
-2

我試圖用AsyncTask加載專輯封面,但我得到NullPointerException如何在Java中調試java.lang.NullPointerException錯誤?

ImageLoader的

public class ImageLoader extends AsyncTask<String, Void, Bitmap>{ 
    Context mcontext; 
    private ImageView image; 
    Cursor cursor; 
    private Bitmap artwork = null; 
    SongsListAdapter songsAdapter; 

    public ImageLoader(ImageView image) { 
     this.image = image; 
    } 

    protected Bitmap doInBackground(String... uri) { 
     for (int i=0; i < songsAdapter.getCount(); i++) { 
      cursor.moveToPosition(i); 
      Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); 
      Long albumid = cursor.getLong(cursor 
        .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)); 
      Uri art = ContentUris.withAppendedId(sArtworkUri, albumid); 
      ContentResolver res = mcontext.getContentResolver(); 
      InputStream in = null; 
      try { 
       in = res.openInputStream(art); 
      } catch (FileNotFoundException e1) { 
       e1.printStackTrace(); 
      } 
      artwork = BitmapFactory.decodeStream(in); 
     } 
     return null; 
    } 

    protected void onPostExecute(Void arg) { 
     // Display the image 
     image.setImageBitmap(artwork); 
    } 
} 

SongsListAdapter

public class SongsListAdapter extends BaseAdapter { 

    private Context mContext; 
    private ArrayList<MusikUntil> songList; 

    public SongsListAdapter(Context context, ArrayList<MusikUntil> list) { 
     this.mContext = context; 
     this.songList = list; 
    } 

    public int getCount() { 
     return songList.size(); 
    } 

    public MusikUntil getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    @SuppressLint("InflateParams") 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = LayoutInflater.from(mContext).inflate(R.layout.song_item, null); 
     } 

     ImageView mImgIcon = (ImageView)convertView.findViewById(R.id.list_image); 
     TextView mTxtJudul = (TextView)convertView.findViewById(R.id.Judul_Musik); 
     TextView mTxtMusisi = (TextView)convertView.findViewById(R.id.Artis); 

     new ImageLoader(mImgIcon).execute(); 
     mTxtJudul.setText(songList.get(position).getSongName()); 
     mTxtMusisi.setText(songList.get(position).getArtistName()); 

     return convertView; 
    } 

    public void setSongsList (ArrayList<MusikUntil> list) { 
     songList = list; 
     this.notifyDataSetChanged(); 
    } 

} 

logcat的

在ImageLoader的個
Process: com.karyaanaknegeri.musikq, PID: 5736 
java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:304) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.karyaanaknegeri.musikq.adapters.SongsListAdapter.getCount()' on a null object reference 
     at com.karyaanaknegeri.musikq.loader.ImageLoader.doInBackground(ImageLoader.java:40) 
     at com.karyaanaknegeri.musikq.loader.ImageLoader.doInBackground(ImageLoader.java:28) 
     at android.os.AsyncTask$2.call(AsyncTask.java:292) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:818) 
+0

看起來'songsAdapter'尚未在'doInBackground()中初始化' – codeMagic

回答

2

1.問題

你只宣佈SongsListAdapter songsAdapter;。在使用之前,您必須首先初始化此對象。

您沒有初始化Cursor cursor;,所以它也會拋出NullPointerException。在SongsListAdapter


2.問題

變化:

public MusikUntil getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return 0; 
} 

public MusikUntil getItem(int position) { 
    return songList.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

3.提示FO你

你的代碼看起來像從一些教程複製粘貼。如果您遇到AsyncTask問題,請嘗試PicassoUniversal Image Loader for Android。這些庫非常易於使用,並且可以幫助您處理加載圖像。