Autore Topic: RuntimeException ListView  (Letto 314 volte)

Offline Kekko

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    W7
RuntimeException ListView
« il: 26 Giugno 2014, 18:26:15 CEST »
0
Salve Ragazzi,
ho un problema cercando di creare una listView tramite il parsing di un dato codice XML.
Vi posto la classe principale:
Codice (Java): [Seleziona]
import java.util.ArrayList;
import java.util.HashMap;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class tab3 extends ListActivity {

        // All static variables
        static final String URL = "http://api.androidhive.info/pizza/?format=xml";
        // XML node keys
        static final String KEY_ITEM = "item"; // parent node
        static final String KEY_ID = "id";
        static final String KEY_NAME = "name";
        static final String KEY_COST = "cost";
        static final String KEY_DESC = "description";

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.tab3main);

                ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

                XMLParser parser = new XMLParser();
                String xml = parser.getXmlFromUrl(URL); // getting XML
                Document doc = parser.getDomElement(xml); // getting DOM element

                NodeList nl = doc.getElementsByTagName(KEY_ITEM);
                // looping through all item nodes <item>
                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_NAME, parser.getValue(e, KEY_NAME));
                        map.put(KEY_COST, "Rs." + parser.getValue(e, KEY_COST));
                        map.put(KEY_DESC, parser.getValue(e, KEY_DESC));

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

                // Adding menuItems to ListView
                ListAdapter adapter = new SimpleAdapter(this, menuItems,
                                R.layout.list_item,
                                new String[] { KEY_NAME, KEY_DESC, KEY_COST }, new int[] {
                                                R.id.name, R.id.desciption, R.id.cost });

                setListAdapter(adapter);

                // selecting single ListView item
                ListView lv = getListView();

                lv.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id) {
                                // getting values from selected ListItem
                                String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
                                String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString();
                                String description = ((TextView) view.findViewById(R.id.desciption)).getText().toString();
                               
                                // Starting new intent
                                Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
                                in.putExtra(KEY_NAME, name);
                                in.putExtra(KEY_COST, cost);
                                in.putExtra(KEY_DESC, description);
                                startActivity(in);

                        }
                });
        }
}


E qui il LogCat:

Codice (Java): [Seleziona]
06-26 12:18:00.820: E/AndroidRuntime(833): FATAL EXCEPTION: main
06-26 12:18:00.820: E/AndroidRuntime(833): Process: com.example.eventtracker, PID: 833
06-26 12:18:00.820: E/AndroidRuntime(833): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.eventtracker/com.example.eventtracker.tab3}: android.os.NetworkOnMainThreadException
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.app.ActivityThread.startActivityNow(ActivityThread.java:2035)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:749)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.widget.TabHost.setCurrentTab(TabHost.java:413)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:154)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:546)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.view.View.performClick(View.java:4438)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.view.View$PerformClick.run(View.java:18422)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.os.Handler.handleCallback(Handler.java:733)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.os.Handler.dispatchMessage(Handler.java:95)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.os.Looper.loop(Looper.java:136)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.app.ActivityThread.main(ActivityThread.java:5017)
06-26 12:18:00.820: E/AndroidRuntime(833):      at java.lang.reflect.Method.invokeNative(Native Method)
06-26 12:18:00.820: E/AndroidRuntime(833):      at java.lang.reflect.Method.invoke(Method.java:515)
06-26 12:18:00.820: E/AndroidRuntime(833):      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
06-26 12:18:00.820: E/AndroidRuntime(833):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
06-26 12:18:00.820: E/AndroidRuntime(833):      at dalvik.system.NativeStart.main(Native Method)
06-26 12:18:00.820: E/AndroidRuntime(833): Caused by: android.os.NetworkOnMainThreadException
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
06-26 12:18:00.820: E/AndroidRuntime(833):      at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
06-26 12:18:00.820: E/AndroidRuntime(833):      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
06-26 12:18:00.820: E/AndroidRuntime(833):      at java.net.InetAddress.getAllByName(InetAddress.java:214)
06-26 12:18:00.820: E/AndroidRuntime(833):      at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
06-26 12:18:00.820: E/AndroidRuntime(833):      at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-26 12:18:00.820: E/AndroidRuntime(833):      at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-26 12:18:00.820: E/AndroidRuntime(833):      at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
06-26 12:18:00.820: E/AndroidRuntime(833):      at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
06-26 12:18:00.820: E/AndroidRuntime(833):      at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-26 12:18:00.820: E/AndroidRuntime(833):      at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
06-26 12:18:00.820: E/AndroidRuntime(833):      at com.example.eventtracker.XMLParser.getXmlFromUrl(XMLParser.java:45)
06-26 12:18:00.820: E/AndroidRuntime(833):      at com.example.eventtracker.tab3.onCreate(tab3.java:40)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.app.Activity.performCreate(Activity.java:5231)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-26 12:18:00.820: E/AndroidRuntime(833):      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
06-26 12:18:00.820: E/AndroidRuntime(833):      ... 18 more

Grazie in anticipo a tutti!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:RuntimeException ListView
« Risposta #1 il: 26 Giugno 2014, 18:39:53 CEST »
0
Il nome dell'eccezione che l'ha causata è abbastanza esplicito:

Citazione
06-26 12:18:00.820: E/AndroidRuntime(833): Caused by: android.os.NetworkOnMainThreadException

Non puoi fare operazioni onerose come le richieste di rete nel main thread (quello dell'interfaccia grafica).

Devi spostare il processing dell'XML in un AsyncTask o Thread separato .
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Kekko

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    W7
Re:RuntimeException ListView
« Risposta #2 il: 26 Giugno 2014, 18:51:24 CEST »
0
Grazie mille, ma praticamente, in codice, cosa dovrei fare?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:RuntimeException ListView
« Risposta #3 il: 26 Giugno 2014, 18:55:21 CEST »
0
Grazie mille, ma praticamente, in codice, cosa dovrei fare?

Devi creare un AsyncTask (in pratica un thread parallelo) ed eseguire il parsing dentro il suo metodo doinbackground.

Puoi prendere ad esempio questo vecchissimo tutorial che avevo fatto, che è sempre valido nei concetti. [facile] HttpBookSearch: AsyncTask, HttpClient, XML parsing, ProgressDialog - Android Developers Italia
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Kekko

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    W7
Re:RuntimeException ListView
« Risposta #4 il: 29 Giugno 2014, 20:41:52 CEST »
0
Grazie mille, risolto :)