2012-10-17 3 views
0

Je suis en train d'analyser JSON à partir d'une URL & l'affichant dans une vue de liste (OFC en utilisant une tâche asynchrone), qui fonctionne bien mais maintenant quand j'essaie d'ajouter une préférence dans la tâche asynchrone, le programme donne une erreur.Comment utiliser les préférences dans une tâche asynchrone?

Voici mon code jusqu'à présent:

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; 
} 




} 

ici est le code de ma classe Préférences:

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; 
    } 

} 

Mon erreur Logcat:

http://pastebin.com/JNy5RmP8

L'erreur est une exception Pointeur nul à la ligne suivante dans PrefMethods Classe:

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

Quelqu'un peut-il m'aider & me signaler où je vais mal?

Merci Vous

Edit: J'ai ajouté des autorisations Internet dans Manifest & le JSON est parfaitement bien s'analysables sans les méthodes de préférences.

Répondre

2

Le paramètre prefs n'est défini sur rien car onCreate n'est jamais appelé.

Les sous-classes d'activité sont pour les activités non préférées.

Créez une classe PrefMethods qui ne développe pas l'activité, mais prend un contexte dans le constructeur.

La classe PrefMethods doit ensuite utiliser ce contexte pour accéder aux préférences.

Quelque chose comme ça

 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; 
    } 

} 
+0

Obtenir des erreurs en utilisant cette méthode, les erreurs sur @Override & savedInstanceState :(Aussi ce soit ne devrait pas PreferenceActivity.MODE_PRIVATE? –

+0

Désolé pour la copie et collez-y erreur. Il est en fait le contexte. MODE_PRIVATE PreferenceActivity est une sous-classe de Context –

+0

Nope donne toujours une exception Null Pointer sur la ligne 16 de PrefMethods, c'est-à-dire prefs = c.getSharedPreferences (PREF_NAME, Context.MODE_PRIVATE), et je passe VideoList.this comme contexte lors de la création de l'objet de Prefmethods –

Questions connexes