0

URLからJSONを解析し、リストビューに表示しています(非同期タスクを使用する場合もあります)。これは正常に機能しますが、非同期タスクに設定を追加しようとすると、プログラムでエラーが発生します。

これが今までの私のコードです:

public class VideoList extends ListActivity {

ArrayAdapter<String> adapter;
ListView lv;
PrefMethods pm= new PrefMethods();;
int vid_id;
public void getJson(){
      new LoadJsonTask().execute();
 }

 private class LoadJsonTask extends AsyncTask<Void, Void, ArrayList<String>>{
      ProgressDialog dialog ;
     protected void onPreExecute (){
          dialog = ProgressDialog.show(VideoList.this ,"Loading....","Retrieving Data,Please Wait !");

     }
      protected ArrayList<String> doInBackground(Void[] params) {

          return populate();
      }


      protected void onPostExecute(ArrayList<String> waveData) {

          adapter=new ArrayAdapter(
                  VideoList.this,android.R.layout.simple_list_item_1,
                    waveData);  
                  lv.setAdapter(adapter);  
                  lv.setTextFilterEnabled(true);
                  dialog.dismiss();
      };

 }

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.parser);
    lv=getListView();

    //vid_id=pm.loadprefs();
    vid_id=0;
    getJson();
}

public ArrayList<String> populate() {
    ArrayList<String> items = new ArrayList<String>();

    try {

        URL urlnew= new URL("www.mydummyjsonlinkhere.com");
        HttpURLConnection urlConnection =
            (HttpURLConnection) urlnew.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();
                    // gets the server json data
        BufferedReader bufferedReader =
            new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream()));
        String next;
        while ((next = bufferedReader.readLine()) != null){
            JSONArray ja = new JSONArray(next);
            vid_id=pm.loadprefs();// here i load the preferences & error is occured
            int k=ja.length();
            for (int i = 0; i < ja.length(); i++) {

                JSONObject jo = (JSONObject) ja.get(i);
                WaveData waveData = new WaveData(jo.getString("upload"), jo.getInt("id"),jo.getString("link"),jo.getString("custommsg"));
                if(jo.getInt("id")>vid_id){
                    if(i==k-1){
                        pm.saveprefs(jo.getInt("id"));  
                        Toast.makeText(getApplicationContext(), "Saved pref no :"+jo.getInt("id"), 500).show();
                    }else{}
                }else{}

                if(jo.has("id")){
                items.add(jo.getString("custommsg"));
                }

            }



        }

    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return items;
}




}

これが私のPreferencesクラスのコードです:

public class PrefMethods extends Activity {
SharedPreferences prefs;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        prefs=getPreferences(MODE_PRIVATE);

 }  


 public void saveprefs(int h){
   SharedPreferences.Editor editor=prefs.edit();
   editor.putInt("id", h);
   editor.commit();
  }
 public void saveprefs(boolean b){
       SharedPreferences.Editor editor=prefs.edit();
       editor.putBoolean("inserted", b);
       editor.commit();
  }

  public int loadprefs(){
int v=prefs.getInt("id",0);
return v;
  }

  public boolean loadprefsboolean(){
    boolean v=prefs.getBoolean("inserted", false);
    return v;
  }

}

私のLogcatエラー:

http://pastebin.com/JNy5RmP8

エラーは、PrefMethodsクラスの次の行でのNullPointerExceptionです。

int v=prefs.getInt("id",0);

誰かが私を助けて、私がどこで間違っているのかを指摘できますか?

ありがとうございました

編集:マニフェストにインターネット権限を追加しました。JSONは設定メソッドなしで完全に正常に解析されています。

4

1 に答える 1

2

onCreateが呼び出されることはないため、prefsは何にも設定されていません。

アクティビティサブクラスは、設定ではなくアクティビティ用です。

Activityを拡張しないが、コンストラクターでContextを受け取るPrefMethodsクラスを作成します。

次に、PrefMethodsクラスは、そのコンテキストを使用して設定にアクセスする必要があります。

このようなもの

      public class PrefMethods {
SharedPreferences prefs;

private Context mContext;

private static final String PREF_NAME = "MyPrefs";

    public PrefMethods( Context c ) 
    {
        prefs= c.getSharedPreferences( PREF_NAME, Context.MODE_PRIVATE);   
    }  


 public void saveprefs(int h){
   SharedPreferences.Editor editor=prefs.edit();
   editor.putInt("id", h);
   editor.commit();
  }
 public void saveprefs(boolean b){
       SharedPreferences.Editor editor=prefs.edit();
       editor.putBoolean("inserted", b);
       editor.commit();
  }

  public int loadprefs(){
int v=prefs.getInt("id",0);
return v;
  }

  public boolean loadprefsboolean(){
    boolean v=prefs.getBoolean("inserted", false);
    return v;
  }

}
于 2012-10-17T07:28:45.610 に答える