2013-07-20 4 views
0

J'ai essayé de trier ce fichier de classe toute la journée et j'ai rencontré encore plus de problèmes. Je crois que ce fichier de classe est complètement faux. Je pense que le AsyncTask est incorrect aussi bien que mon onCreateView est je crois aussi. Ce que j'essaie de faire est de télécharger un fichier XML à partir d'Internet et de mettre les informations dans des zones pour le ListView à utiliser. Je l'ai eu fonctionné mais j'ai décidé de le changer pour l'utiliser comme fragment et c'est quand les problèmes sont survenus car vous ne pouvez pas avoir la même chose pour une activité qu'un fragment évidemment. Voici mon fichier de classe et comme je ne comprends pas où je me suis trompé en termes de l'AsyncTask en particulier, pourrais-je avoir de l'aide. Merci de m'avoir aidé! Erreurs: L'analyseur de la tâche asynchrone ne peut pas avoir le symbole résolu et la chaîne xml est incorrecte pour ce que je veux l'utiliser pour. Je suis vraiment perdu ici maintenant.Configuration de AsyncTask incorrecte - Android

CustomizedListView.class

public class CustomizedListView extends Fragment { 
// All static variables 
static final String URL = "http://api.androidhive.info/music/music.xml"; 
// XML node keys 
static final String KEY_SONG = "song"; // parent node 
static final String KEY_ID = "id"; 
static final String KEY_TITLE = "title"; 
static final String KEY_ARTIST = "artist"; 
static final String KEY_DURATION = "duration"; 
static final String KEY_THUMB_URL = "thumb_url"; 

ListView list; 
LazyAdapter adapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    final View v = inflater.inflate(R.layout.list_row, container, false); 
    list = (ListView) v.findViewById(R.id.game_list); 
    return v; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 
    new TheTask().execute(); 
    XMLParser parser = new XMLParser(); 
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL 
    Document doc = parser.getDomElement(xml); // getting DOM element 

    NodeList nl = doc.getElementsByTagName(KEY_SONG); 
    // looping through all song nodes <song> 
    for (int i = 0; i < nl.getLength(); i++) { 
     // creating new HashMap 
     HashMap<String, String> map = new HashMap<String, String>(); 
     Element e = (Element) nl.item(i); 
     // adding each child node to HashMap key => value 
     map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
     map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
     map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST)); 
     map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION)); 
     map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL)); 

     // adding HashList to ArrayList 
     songsList.add(map); 
    } 




    // Getting adapter by passing xml data ArrayList 
    adapter=new LazyAdapter(getActivity(), songsList); 
    list.setAdapter(adapter); 


    // Click event for single list row 
    list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 


     } 
    }); 
} 
} 
class TheTask extends AsyncTask<Void,Void,Void> { 
static final String URL = "http://api.androidhive.info/music/music.xml"; 
static final String xml = xml; 


@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 
} 

@Override 
protected void onPostExecute(Void result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
} 

@Override 
protected Void doInBackground(Void... params) { 
    // TODO Auto-generated method stub 
    String xml = parser.getXmlFromUrl(URL); 
    return null; 
} 

}

Logcat erreur après le changement de code:

07-20 20:48:18.941 22942-22942/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main 
    java.lang.NullPointerException 
    at com.example.app.CustomizedListView.onCreate(CustomizedListView.java:52) 
    at android.support.v4.app.Fragment.performCreate(Fragment.java:1437) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:877) 
    at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:807) 
    at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:801) 
    at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130) 
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1062) 
    at android.support.v4.view.ViewPager.populate(ViewPager.java:911) 
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1432) 
    at android.view.View.measure(View.java:15525) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.view.View.measure(View.java:15525) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:847) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
    at android.view.View.measure(View.java:15525) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2434) 
    at android.view.View.measure(View.java:15525) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
    at android.view.Choreographer.doFrame(Choreographer.java:532) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
    at android.os.Handler.handleCallback(Handler.java:725) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5227) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

'OnCreate' fait usage de' list' mais ListView est instancié plus tard dans 'onCreateView' – gunar

Répondre

0

Vous faisiez tout à fait tort .. Je suggère d'aller lire et Multi Threaded ProgrammingAsynchronous Tasks un peu qui vous aidera beaucoup autour de cela ..

Vous avez eu beaucoup de problèmes dans le code, je fixe beaucoup de choses mais je mentionnerai les plus importants et ceux que je me souviens en fait: p

  1. Si vous souhaitez utiliser des variables définies globalement, votre AsyncTask classe devraient être définis au sein votre classe Activity .. ce qui dans votre cas a été défini en dehors
  2. Lorsque vous exécutez une AsyncTask, il crée un nouveau thread et les commandes du nouveau thread d'arrière-plan sont couru indépendamment de ceux du filetées UI. Mon point est que, beaucoup de gens pensent que le thread UI s'arrêtera pour le thread Background pour finir de fonctionner. Ce qui est faux et aussi un problème commun chez les programmeurs.
  3. Vous détestez vraiment l'indentation. N'est-ce pas? Cela rend d'autres programmeurs dingues, en lisant un mauvais code indenté, ce qui mène à votre question sans réponse.

Voici le code fixe:

public class CustomizedListView extends Fragment { 
    // All static variables 
    static final String URL = "http://api.androidhive.info/music/music.xml"; 
    // XML node keys 
    static final String KEY_SONG = "song"; // parent node 
    static final String KEY_ID = "id"; 
    static final String KEY_TITLE = "title"; 
    static final String KEY_ARTIST = "artist"; 
    static final String KEY_DURATION = "duration"; 
    static final String KEY_THUMB_URL = "thumb_url"; 


    ListView list; 
    ArrayList<HashMap<String, String>> songsList; 
    View view; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     final View v = inflater.inflate(R.layout.list_row, container, false); 
     list = (ListView) v.findViewById(R.id.game_list); 
     view = v; 
     return v; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     new TheTask().execute(); 

     // Click event for single list row 
     list.setOnItemClickListener(new OnItemClickListener() { 


      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       // TODO Auto-generated method stub 

      } 
     }); 
    } 

    class TheTask extends AsyncTask<Void, Void, Void> { 

     static final String URL = "http://api.androidhive.info/music/music.xml"; 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      XMLParser parser = new XMLParser(); 
      String xml = parser.getXmlFromUrl(URL); // getting XML from URL 
      songsList = new ArrayList<HashMap<String, String>>(); 
      Document doc = parser.getDomElement(xml); // getting DOM element 

      NodeList nl = doc.getElementsByTagName(KEY_SONG); 
      // looping through all song nodes <song> 
      for (int i = 0; i < nl.getLength(); i++) { 
       // creating new HashMap 
       HashMap<String, String> map = new HashMap<String, String>(); 
       Element e = (Element) nl.item(i); 
       // adding each child node to HashMap key => value 
       map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
       map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
       map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST)); 
       map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION)); 
       map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL)); 

       // adding HashList to ArrayList 
       songsList.add(map); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // Getting adapter by passing xml data ArrayList 
      LazyAdapter adapter = new LazyAdapter(getActivity(), songsList); 
      ((ListView) view.findViewById(R.id.game_list)).setAdapter(adapter); 
      super.onPostExecute(result); 
     } 
    } 
} 
+0

Je sais que mon code aura beaucoup de problèmes et une manque d'optimisations car je ne fais que tester mais j'ai besoin de faire fonctionner ça. Pour votre troisième point, l'absence d'indentation correcte est due à la copie et au collage de mon IDE. Quand je démarre l'application en utilisant votre code, je reçois une force proche. Pourriez-vous regarder le logcat que j'ai posté au bas de mon message pour voir où se situe le problème, car je ne vois pas de problème particulier. Quoi qu'il en soit, je suis reconnaissant de l'avoir fait jusqu'à présent, car j'ai eu beaucoup de problèmes toute la journée. – ThePoloDoc

+0

Pouvez-vous indiquer quelle est la ligne 52? thx –

+0

La ligne 52 est list.setOnItemClickListener (new OnItemClickListener() { – ThePoloDoc