2013-03-30 4 views
1

Здравствуйте, у меня возникла проблема с заполнением ленивого ListView с помощью asyncTask. Поэтому я ищу вам помощь.Заполнение ListView с помощью asyncTask

Вот мой класс активность:

import java.util.ArrayList; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.ListView; 

import com.outsoucefarm.musicagratis.functions.AlbumLazyAdapter; 
import com.outsoucefarm.musicagratis.functions.JSONParser; 
import com.outsoucefarm.musicagratis.objects.Albums; 
import com.outsoucefarm.musicagratis.objects.Songs; 
import com.outsourcefarm.musicagratis.R; 

public class LatestAlbums extends Activity { 

    // widgets 
    private ListView list; 
    private ImageView back; 
    private EditText find; 

    // URL to make request 
    private static String url = "http://someurl.com/data.json"; 

    // JSON Node names 
    private static final String TAG_ALBUMS = "albums"; 
    private static final String TAG_ID = "id"; 
    private static final String TAG_NAME = "name"; 
    private static final String TAG_SINGER = "singer"; 
    private static final String TAG_GENRE = "genre"; 
    private static final String TAG_MIX = "mix"; 
    private static final String TAG_THUMB = "thumb"; 
    private static final String TAG_SONGS = "songs"; 
    private static final String TAG_SONG_TITLE = "song"; 
    private static final String TAG_SONG_ARTIST = "artist"; 
    private static final String TAG_SONG_MP3 = "mp3"; 
    private static final String TAG_SONG_MP4 = "mp4"; 
    private static final String TAG_SONG_THUMB = "thumb"; 

    // albums JSONArray 
    private JSONArray albums = null; 
    private JSONArray sngs = null; 

    private ArrayList<Albums> albumsArray; 
    private ArrayList<Songs> songsArray; 
    private AlbumLazyAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.latest_albums); 
     try { 
      loadJSON(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     // initWidgets(); 
    } 

    private void initWidgets() { 
     list = (ListView) findViewById(R.id.listView1); 
     back = (ImageView) findViewById(R.id.latest_back_img); 
     find = (EditText) findViewById(R.id.latest_search_et); 
     back.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       finish(); 
      } 
     }); 
     adapter = new AlbumLazyAdapter(this, albumsArray); 
     list.setAdapter(adapter); 
    } 

    public void loadJSON() throws JSONException { 
     AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... params) { 
       // Creating JSON Parser instance 
       JSONParser jParser = new JSONParser(); 

       // getting JSON string from URL 
       JSONObject json = jParser.getJSONFromUrl(url); 

       JSONObject theJSON; 

       try { 
        // Getting Array of albums 
        theJSON = json.getJSONObject("json"); 
        albums = theJSON.getJSONArray(TAG_ALBUMS); 
        // sngs=theJSON.getJSONArray(TAG_SONGS); 
        // looping through All albums 
        for (int i = 0; i < albums.length(); i++) { 
         JSONObject c = albums.getJSONObject(i); 

         // Storing each json item in variable 
         String album_id = c.getString(TAG_ID); 
         String album_name = c.getString(TAG_NAME); 
         String album_singer = c.getString(TAG_SINGER); 
         String album_mix = c.getString(TAG_MIX); 
         String album_genre = c.getString(TAG_GENRE); 
         String album_thumb = c.getString(TAG_THUMB); 
         albumsArray.add(new Albums(album_id, album_name, 
           album_singer, album_genre, album_mix, 
           album_thumb)); 
         Log.v("--", "Albums" + " " + album_id + " " 
           + album_name + " " + album_genre + " " 
           + album_singer + " " + album_thumb + " " 
           + album_mix); 
         sngs = c.getJSONArray(TAG_SONGS); 

         // getting songs for the album 
         for (int j = 0; j < sngs.length(); j++) { 
          JSONObject songs = sngs.getJSONObject(j); 
          String song_artist = songs 
            .getString(TAG_SONG_ARTIST); 
          String song_mp3 = songs.getString(TAG_SONG_MP3); 
          String song_mp4 = songs.getString(TAG_SONG_MP4); 
          String song_thumb = songs.getString(TAG_SONG_THUMB); 
          String song_title = songs.getString(TAG_SONG_TITLE); 
          Log.v("--", "Songs: " + j + " " + song_artist + " " 
            + song_mp3 + " " + song_mp4 + " " 
            + song_thumb + " " + song_title); 
          songsArray.add(new Songs(song_title, song_artist, 
            song_mp3, song_mp4, song_thumb)); 
         } 

        } 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
      @Override 
      protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 
       initWidgets(); 
       adapter.notifyDataSetChanged(); 
      } 

     }; task.execute(); 

    } 

} 

И вот что я получаю от LogCat:

03-30 19:44:48.352: E/AndroidRuntime(2474): FATAL EXCEPTION: AsyncTask #1 
03-30 19:44:48.352: E/AndroidRuntime(2474): java.lang.RuntimeException: An error occured while executing doInBackground() 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at java.lang.Thread.run(Thread.java:856) 
03-30 19:44:48.352: E/AndroidRuntime(2474): Caused by: java.lang.NullPointerException 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at com.outsourcefarm.musicagratis.activities.LatestAlbums$2.doInBackground(LatestAlbums.java:116) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at com.outsourcefarm.musicagratis.activities.LatestAlbums$2.doInBackground(LatestAlbums.java:1) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
03-30 19:44:48.352: E/AndroidRuntime(2474):  ... 5 more 

Это на линии 116:

albumsArray.add(new Albums(album_id, album_name, 
           album_singer, album_genre, album_mix, 
           album_thumb)); 
+0

В чем проблема/ошибка? – Tushar

+0

@Tushar обновил вопрос .. Я думаю, loadJSON doen't выполняет вообще –

ответ

1

Вероятно забудьте позвонить AsyncTask.execute() в loadJSON метод запуска AsyncTask. В вашем банке вам нужно будет положить task.execute(); в качестве последнего заявления в loadJSON() метод

+0

, где мне нужно поставить AsyncTask.execute ("") в мой код, мой друг? –

+0

@BozidarPrcovski: просто поместите 'task.execute();' в качестве последнего оператора в 'loadJSON()' method –

+0

Обновлен мой вопрос с новым изменением, теперь у меня есть выход logcat и сбой моего приложения –

Смежные вопросы