Autore Topic: Lettura file JSON  (Letto 1111 volte)

Offline dicba

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    AVD
  • Sistema operativo:
    Mac OS X 10.6.8
Lettura file JSON
« il: 07 Giugno 2013, 09:52:17 CEST »
0
Ragazzi ho bisogno del vostro aiuto nel capire questo messaggio di logcat rispetto al lancio di questa applicazione che ha il problema in questa classe main activity;

Codice (Java): [Seleziona]
package com.example.ontheroute;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
       
        //private JSONArray jsonArray;
        private JSONReader jsonArray;
        private ListView lv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_layout);
       
        lv = (ListView)findViewById(R.id.listView);
               
                try {
                        // La classe JSONReader permette di leggere un file JSON
                        jsonArray = new JSONReader("list.json", this);
                       
            } catch (Exception e) {
                        throw new RuntimeException(e);
                }
               
                // Utilizzo il BaseAdapter per prendere gli elementi della collezione
                // e riempire il ListLayout
                BaseAdapter ba = new BaseAdapter() {
                       
                        // Restituisce la vista dell'item alla posizione position
                        public View getView(int position, View recycledView, ViewGroup arg2) {
                                if (recycledView == null) {
                                        // Ne preparo una nuova
                                        recycledView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_layout, null);
                                        // Con il LayoutInflater includo nel ListLayout un ItemLayout
                                }
                                // Prendo gli elementi dell'ItemLayout
                                TextView tv = (TextView) recycledView.findViewById(R.id.itemLabel);
                                ImageView iv = (ImageView) recycledView.findViewById(R.id.itemIcon);
                                // Riempio l'ItemLayout con i valori di position
                                try {
                                        // Inserisco nella label il testo alla voce "opera" del file JSON
                                        //tv.setText(jsonArray.getJSONObject(position).getString("opera"));
                                        tv.setText(jsonArray.getJSONObject(position).getString("category"));
                                        // Devo creare l'immagine da utilizzare
                                        String iconName = jsonArray.getJSONObject(position).getString("thumb");
                                        Bitmap b = BitmapFactory.decodeStream(getAssets().open(iconName));
                                        iv.setImageBitmap(b);
                                       
                                } catch (Exception e) {
                                        throw new RuntimeException(e);
                                }
                                return recycledView;
                        }
                       
                        public long getItemId(int position) {
                                // Restituisce l'id dell'elemento alla posizione position
                                // che per comodit‡ sar‡ proprio position
                                return position;
                        }
                       
                        public Object getItem(int position) {
                                try {
                                        // Restituisce l'elemento alla posizione position
                                        return jsonArray.getJSONObject(position);
                                } catch (JSONException e) {
                                        throw new RuntimeException(e);
                                }
                        }
                       
                        public int getCount() {
                                // Restituisce il numero di elementi della collezione
                                return jsonArray.length();
                        }
                };
                       
                lv.setAdapter(ba);
                // Setto l'azione al tap sull'elemento del ListView
                lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                       
                        public void onItemClick(AdapterView<?> adView, View arg1, int position, long arg3) {
                                // Creo l'intent per aprire l'activity del dettaglio
                                Adapter a = adView.getAdapter();
                                JSONObject o = (JSONObject) a.getItem(position);
                                try {
                                        String path = o.getString("path");
                                        Intent dettaglio = new Intent(MainActivity.this, ActivityDetail.class);
                                        dettaglio.putExtra("path", path);
                                        startActivity(dettaglio);
                                } catch (Exception e) {
                                        throw new RuntimeException(e);
                                }
                        }
                });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}


Codice (Java): [Seleziona]
06-07 09:47:14.969: E/AndroidRuntime(761): FATAL EXCEPTION: main
06-07 09:47:14.969: E/AndroidRuntime(761): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{it.polito.laroute1/it.polito.laroute1.MainActivity}: java.lang.NullPointerException
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983)
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.app.ActivityThread.access$600(ActivityThread.java:130)
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.os.Handler.dispatchMessage(Handler.java:99)
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.os.Looper.loop(Looper.java:137)
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.app.ActivityThread.main(ActivityThread.java:4745)
06-07 09:47:14.969: E/AndroidRuntime(761):      at java.lang.reflect.Method.invokeNative(Native Method)
06-07 09:47:14.969: E/AndroidRuntime(761):      at java.lang.reflect.Method.invoke(Method.java:511)
06-07 09:47:14.969: E/AndroidRuntime(761):      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
06-07 09:47:14.969: E/AndroidRuntime(761):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-07 09:47:14.969: E/AndroidRuntime(761):      at dalvik.system.NativeStart.main(Native Method)
06-07 09:47:14.969: E/AndroidRuntime(761): Caused by: java.lang.NullPointerException
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101)
06-07 09:47:14.969: E/AndroidRuntime(761):      at it.polito.laroute1.MainActivity.<init>(MainActivity.java:20)
06-07 09:47:14.969: E/AndroidRuntime(761):      at java.lang.Class.newInstanceImpl(Native Method)
06-07 09:47:14.969: E/AndroidRuntime(761):      at java.lang.Class.newInstance(Class.java:1319)
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
06-07 09:47:14.969: E/AndroidRuntime(761):      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
06-07 09:47:14.969: E/AndroidRuntime(761):      ... 11 more


Quando clicco sugli errori del logcat l'unica cosa che mi appare è import.widget.baseadapter; non capisco perchè, soprattutto il codice non genera errori..

Aiutatemi please!!!!

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Lettura file JSON
« Risposta #1 il: 07 Giugno 2013, 10:29:31 CEST »
0
L'eccezione la lancia  it.polito.laroute1.MainActivity.
Quella che ci hai postato è com.example.ontheroute.MainActivity....

Inoltre l'eccezione è nell'init. Controlla nel costruttore, o in eventuali variabili di classe che instanzi direttamente.

Consiglio ulteriore. Stai facendo un parser, e un decode delle immagini direttamente nell'onCreate (cioè nel thread principale UI). Non è una buona idea.
« Ultima modifica: 07 Giugno 2013, 10:31:10 CEST da GabMarioPower »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Lettura file JSON
« Risposta #2 il: 07 Giugno 2013, 10:33:43 CEST »
0
...il problema in questa classe main activity;

Citazione
Codice (Java): [Seleziona]
package com.example.ontheroute;
//...
public class MainActivity extends Activity {


Citazione
Codice (Java): [Seleziona]
06-07 09:47:14.969: E/AndroidRuntime(761): FATAL EXCEPTION: main
06-07 09:47:14.969: E/AndroidRuntime(761): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{it.polito.laroute1/it.polito.laroute1.MainActivity}: java.lang.NullPointerException

Non credo proprio che l'errore del logcat sia legato alla classe che hai postato, sono due package differenti (com.example.ontheroute l'uno, it.polito.laroute1 l'altro).
O hai pasticciato con il manifest o forse ci serve che posti il codice che davvero sta generando l'errore  :-)

Offline dicba

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    AVD
  • Sistema operativo:
    Mac OS X 10.6.8
Re:Lettura file JSON
« Risposta #3 il: 07 Giugno 2013, 10:51:40 CEST »
0
Grazie della collaborazione, non so perchè ma andavano in conflitto i package. Ho eliminato vari package.
Il problema del logcat esiste ancora però. Vi posto il codice logcat.

Codice (Java): [Seleziona]
06-07 10:43:38.627: E/AndroidRuntime(724): FATAL EXCEPTION: main
06-07 10:43:38.627: E/AndroidRuntime(724): java.lang.RuntimeException: org.json.JSONException: Value at 4 is null.
06-07 10:43:38.627: E/AndroidRuntime(724):      at com.example.ontheroute.MainActivity$1.getView(MainActivity.java:72)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.AbsListView.obtainView(AbsListView.java:2271)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.ListView.makeAndAddView(ListView.java:1769)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.ListView.fillDown(ListView.java:672)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.ListView.fillFromTop(ListView.java:733)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.ListView.layoutChildren(ListView.java:1622)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.AbsListView.onLayout(AbsListView.java:2106)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.View.layout(View.java:13754)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.ViewGroup.layout(ViewGroup.java:4364)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.View.layout(View.java:13754)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.ViewGroup.layout(ViewGroup.java:4364)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.View.layout(View.java:13754)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.ViewGroup.layout(ViewGroup.java:4364)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.View.layout(View.java:13754)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.ViewGroup.layout(ViewGroup.java:4364)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1868)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1689)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.Choreographer.doCallbacks(Choreographer.java:555)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.Choreographer.doFrame(Choreographer.java:525)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.os.Handler.handleCallback(Handler.java:615)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.os.Handler.dispatchMessage(Handler.java:92)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.os.Looper.loop(Looper.java:137)
06-07 10:43:38.627: E/AndroidRuntime(724):      at android.app.ActivityThread.main(ActivityThread.java:4745)
06-07 10:43:38.627: E/AndroidRuntime(724):      at java.lang.reflect.Method.invokeNative(Native Method)
06-07 10:43:38.627: E/AndroidRuntime(724):      at java.lang.reflect.Method.invoke(Method.java:511)
06-07 10:43:38.627: E/AndroidRuntime(724):      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
06-07 10:43:38.627: E/AndroidRuntime(724):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-07 10:43:38.627: E/AndroidRuntime(724):      at dalvik.system.NativeStart.main(Native Method)
06-07 10:43:38.627: E/AndroidRuntime(724): Caused by: org.json.JSONException: Value at 4 is null.
06-07 10:43:38.627: E/AndroidRuntime(724):      at org.json.JSONArray.get(JSONArray.java:259)
06-07 10:43:38.627: E/AndroidRuntime(724):      at org.json.JSONArray.getJSONObject(JSONArray.java:480)
06-07 10:43:38.627: E/AndroidRuntime(724):      at com.example.ontheroute.JSONReader.getJSONObject(JSONReader.java:61)
06-07 10:43:38.627: E/AndroidRuntime(724):      at com.example.ontheroute.MainActivity$1.getView(MainActivity.java:65)
06-07 10:43:38.627: E/AndroidRuntime(724):      ... 36 more
06-07 10:43:38.917: D/dalvikvm(724): GC_CONCURRENT freed 159K, 4% free 8261K/8519K, paused 22ms+17ms, total 243ms
06-07 10:44:02.807: I/Process(724): Sending signal. PID: 724 SIG: 9

e anche il codice della classe JSONReader che ho creato

Codice (Java): [Seleziona]
package com.example.ontheroute;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;

/**
 * Questa classe mi serve per leggere facilmente un file JSON
 *
 * @author Samuele
 *
 */

public class JSONReader {
       
        private JSONArray jsonArray;
       
        public JSONReader() {
                jsonArray = new JSONArray();
        }
       
        /**
         * Dato il path di un file JSON, costruisco un JSONArray
         * con gli elementi contenuti nel file
         *
         * @param path
         * @param c
         * @throws Exception
         */

        public JSONReader(String path, Context c) throws Exception {
                // Servir‡ per contenere le stringhe del file JSON
                StringBuilder sb = new StringBuilder();
                // Con getAssets() prendo dalla cartella assets il file list.json
                InputStreamReader isr = new InputStreamReader(c.getAssets().open(path));
                BufferedReader br = new BufferedReader(isr);
               
                int i=0;
                // Il BufferReader legge carattere per carattere
                // e quando arriva alla fine restituisce -1
                while ((i = br.read()) != -1) {
                        // Creo una stringa unica con tutti i caratteri grazie allo StringBuilder
                        sb.append((char) i);
                }
                // Chiudo il BufferReader per rilasciare risorse
                br.close();
                // Creo il JSONArray passandogli lo StringBuilder
                jsonArray = new JSONArray(sb.toString());
        }
       
        /**
         * Restituisco il JSONObject alla posizione "position"
         *
         * @param position
         * @return JSONObject
         * @throws JSONException
         */

        public JSONObject getJSONObject(int position) throws JSONException {
                return jsonArray.getJSONObject(position);
        }
       
        /**
         * Restituisco la dimensione del JSONArray
         *
         * @return int
         */

        public int length() {
                return jsonArray.length();
        }
}

Grazie del consiglio GabMarioPower.

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Lettura file JSON
« Risposta #4 il: 07 Giugno 2013, 16:55:27 CEST »
0
com.example.ontheroute.MainActivity$1.getView(MainActivity.java:72)

Posta il codice della main activity :)
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Lettura file JSON
« Risposta #5 il: 07 Giugno 2013, 17:08:16 CEST »
0
Ipotizzo alla cieca: l'array di oggetti json parte da zero, la posizione dell'adapter che usi per recuperare il valore parte invece da uno.
Sul metodo della classe di utilità che usi per ottenere l'oggetto json cambia passando al get position-1 invece che position e basta.