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:
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.
Obtenir des erreurs en utilisant cette méthode, les erreurs sur @Override & savedInstanceState :(Aussi ce soit ne devrait pas PreferenceActivity.MODE_PRIVATE? –
Désolé pour la copie et collez-y erreur. Il est en fait le contexte. MODE_PRIVATE PreferenceActivity est une sous-classe de Context –
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 –