Autore Topic: Generare una View a partire da una risorsa JSONArray  (Letto 509 volte)

Offline moaiamorfo

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • moaiamorfo
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note
  • Sistema operativo:
    Microsoft Windows 8, Ubuntu Linux 11.04
Generare una View a partire da una risorsa JSONArray
« il: 20 Agosto 2013, 11:48:49 CEST »
0
Buongiorno,

all'onCreate della mia Activity, utilizzo un IntentService per recuperare dal web un file XML, dal quale genero un oggetto JSONArray.
Qual'è il modo migliore per aggiornare una View che ho nell'Activity (dall'IntentService, in qualche modo), inserendo in essa le voci del JSONArray?

Grazie.

Saluti.
Python-it.org # il punto di riferimento italiano per gli appassionati di Python

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Generare una View a partire da una risorsa JSONArray
« Risposta #1 il: 20 Agosto 2013, 12:12:18 CEST »
0
Puoi creare un singleton, oppure estendi application. 
All'interno di questa struttura , salvi i dati che hai scaricato.

Poi, notifichi all'activity che ci sono questi dati, tramite un broadcast
Aggiornare UI tramite BroadcastReceiver - Android Developers Italia

Nel tutorial linkato viene lanciato il l'Intent di broadcast in un TimerTask e i dati vengono passati nell'Intent, tu lo invece lo lancerai all'interno dell' IntentService, senza dati (tu ce li hai nel singleton).  Nel tuo caso ti sconsiglio di passare i dati nell'Intent stesso perche ha un limite di capacita di trasporto 1mb

Offline moaiamorfo

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • moaiamorfo
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note
  • Sistema operativo:
    Microsoft Windows 8, Ubuntu Linux 11.04
Re:Generare una View a partire da una risorsa JSONArray
« Risposta #2 il: 25 Agosto 2013, 11:50:31 CEST »
0
Ciao Qlimax,

grazie per la risposta. Al momento credo di aver risolto come segue.

Questo è l'IntentService:

Codice (Java): [Seleziona]
package it.polibit.test;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

public class MyService extends IntentService {
       
        static final String BROADCAST_ACTION = "it.polibit.test.listviewcomuni";
        Intent intent;

        public MyService(){
                super("MyService");
        }
       
        @Override
        protected void onHandleIntent(Intent intent){
                HttpClient httpClient = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet("http://www.xxx.it/ep/comuni?p=0");
                try{
                        HttpResponse response = httpClient.execute(httpGet);
                        HttpEntity entity = response.getEntity();
                        String result = EntityUtils.toString(entity);
                        intent = new Intent(BROADCAST_ACTION);
                        intent.putExtra("comuni", result);
                sendBroadcast(intent);
                }catch(Exception e){
                        Log.i("MainActivity", e.toString());
                }
        }
       
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return super.onStartCommand(intent,flags,startId);
        }
       
}

Mentre questo è il codice dell'Activity:

Codice (Java): [Seleziona]
package it.polibit.test;

import org.json.JSONArray;
import org.json.JSONObject;

import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {
       
        private BroadcastReceiver broadcastReceiver = new BroadcastReceiver(){
                @Override
                public void onReceive(Context context, Intent intent){
                        Bundle bundle = intent.getExtras();
                        String s = bundle.getString("comuni");
                        try{
                                JSONArray jsonArray = new JSONArray(s);
                                String[] comuni = new String[jsonArray.length()];
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject jsonObject = jsonArray.getJSONObject(i);
                                comuni[i] = (jsonObject.getString("taxonomy_term_data_name"));
                            }
                                final ListView listview = (ListView) findViewById(R.id.listview);
                                listview.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, comuni));
                        }catch(Exception e){
                                Log.i("MainActivity", e.toString());
                        }
                }
        };

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                this.requestWindowFeature(Window.FEATURE_NO_TITLE);
                setContentView(R.layout.activity_main);
                Intent intent = new Intent(this, MyService.class);
                startService(intent);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                // getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }
       
        @Override
        public void onResume(){
                super.onResume();
                registerReceiver(broadcastReceiver, new IntentFilter(MyService.BROADCAST_ACTION));
        }
       
        @Override
        public void onPause(){
                super.onPause();
                unregisterReceiver(broadcastReceiver);
        }

}

Procedo bene?

Grazie.

Saluti.
Python-it.org # il punto di riferimento italiano per gli appassionati di Python

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Generare una View a partire da una risorsa JSONArray
« Risposta #3 il: 26 Agosto 2013, 11:06:56 CEST »
0
Se supporti solo versioni >= gingerbread (Api Levels), meglio usare HttpURLConnection come consigliato qui:
Android’s HTTP Clients | Android Developers Blog

Quello che volevo dirti nella mia risposta precedente, riguardo all'uso di un Singleton per il passaggio dei dati, è che questa chiamata
Codice: [Seleziona]
intent.putExtra("comuni", result);puo' farti crashare l'applicazione, se result è una stringa troppo lunga.

Happy Coding  ;-)
« Ultima modifica: 26 Agosto 2013, 11:09:40 CEST da Qlimax »

Offline moaiamorfo

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • moaiamorfo
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note
  • Sistema operativo:
    Microsoft Windows 8, Ubuntu Linux 11.04
Re:Generare una View a partire da una risorsa JSONArray
« Risposta #4 il: 02 Settembre 2013, 09:59:56 CEST »
0
Ciao Qlimax,

grazie, a questo punto posso marcare il thread come risolto.

Happy coding to you, too. :)

Saluti.
Python-it.org # il punto di riferimento italiano per gli appassionati di Python