Autore Topic: TabHost e recupero info dal web  (Letto 829 volte)

Offline wino_7

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy s
  • Play Store ID:
    Francesco Di Iorio
  • Sistema operativo:
    Windows 7, Debian
TabHost e recupero info dal web
« il: 10 Ottobre 2011, 11:37:14 CEST »
0
Salve a tutti,
sto realizzando un interfaccia a tab dove visualizzo dei dati scaricati dal web.
Vi posto il codice delle 3 classi che ho utilizzato.

Dall'activity accedo all'oggetto Application dove è contenuto il client Http e dove ci sono i metodi per il download degli oggetti Json.
Codice (Java): [Seleziona]
package mioPackage;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TabHost;

public class NewsActivity extends Activity {

        private Handler myHandler;


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

                myHandler = new Handler() {

                        @Override
                        public void handleMessage(Message msg) {
                                /*String text = msg.obj.toString();
                                TextView textView = (TextView)findViewById(R.id.secondText);
                                textView.setText(text);*/

                                TabHost tabHost = (TabHost) findViewById(R.id.myTabHost);
                                tabHost.setup();
                                // Aggiungiamo il Tab associato alla prima view
                                tabHost.addTab(tabHost.newTabSpec("Marta").setContent(R.id.martaView).setIndicator("Marta"));
                                // Ottengo il riferimento al contenuto generato dinamicamente
                                MyTabContent content = new MyTabContent(NewsActivity.this, msg.obj.toString());
                                // Aggiungiamo un secondo tab che utilizza una factory
                                tabHost.addTab(tabHost.newTabSpec("Factory").setContent(content).setIndicator("Factory"));
                       
                        }
                };
               
                // Otteniamo il riferimento al HttpClient attraverso la Application
                CustomApplication ca = (CustomApplication)getApplication();
                ca.setHandler(myHandler);
                ca.sendHttpRequest();
        }

}

Questo è l'oggetto Application
Codice (Java): [Seleziona]
package mioPackage;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;

import android.app.Application;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class CustomApplication extends Application {

        private final static String LOG_TAG = "CustomApplication";
       
        private Handler myHandler;

        private HttpClient httpClient;
       

       
        @Override
        public void onCreate() {
                super.onCreate();
                // Inizializziamo il riferimento all'HttpClient Thread Safe
                httpClient = createHttpClient();
        }

        @Override
        public void onLowMemory() {
                super.onLowMemory();
                Log.i(LOG_TAG,"Low Memory!!");
                // Rilasciamo le risorse del client
                releaseHttpClient();
        }

        @Override
        public void onTerminate() {
                super.onTerminate();
                Log.i(LOG_TAG,"Terminate CustomApplication");
                // Rilasciamo le risorse del client
                releaseHttpClient();           
        }

        public HttpClient getThreadSafeHttpClient(){
                return httpClient;
        }
       
        private final HttpClient createHttpClient(){
                // Per creare il corrispondente ThreadSafeClientConnManager abbiamo
                // bisogno delle informazioni relative al tipo di protocollo che intendiamo
                // gestire. Nel nostro caso definiamo il supporto per l'HTTP e l'HTTPS attraverso
                // la definizione di alcuni parametri e schemi
                HttpParams httpParams = new BasicHttpParams();
                // Impostiamo la versione del protocollo HTTP alla 1.1
                HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
                // Impostiamo il charset di default
                HttpProtocolParams.setContentCharset(httpParams, HTTP.DEFAULT_CONTENT_CHARSET);
                // Dobbiamo quindi descrivere quelli che sono i protocolli che intendiamo
                // gestire associando a ciascuno uno schema ed una Factory delle connessioni
                // Socket da utilizzare
                SchemeRegistry schemeRegistry = new SchemeRegistry();
                // Gestiamo il protocollo HTTP nella porta 80
                Scheme httpScheme = new Scheme("http",PlainSocketFactory.getSocketFactory(),80);
                schemeRegistry.register(httpScheme);
                // Gestiamo il protocollo HTTPS nella porta 443
                Scheme httpsScheme = new Scheme("https",SSLSocketFactory.getSocketFactory(),443);
                schemeRegistry.register(httpsScheme);          
                // Creiamo il ThreadSafeClientConnManager e lo assegnamo al client
                ClientConnectionManager tsConnManager = new ThreadSafeClientConnManager(httpParams,schemeRegistry);
                HttpClient tmpClient = new DefaultHttpClient(tsConnManager,httpParams);
                // ritorniamo l'oggetto creato
                Log.i(LOG_TAG,"HttpClient Created!");
                return tmpClient;
        }

        public void setHandler(Handler myHandler){
                this.myHandler = myHandler;
        }
       
        public void sendHttpRequest() {

                // Avviamo un Thread con il corrispondente codice di connessione
                Thread workerThread = new Thread(new Runnable() {

                        @Override
                        public void run() {
                                try {

                                        HttpClient httpClient = getThreadSafeHttpClient();
                                        // Creiamo la HttpUriRequest relativamente al metodo GET
                                        HttpGet request = new HttpGet();
                                        // Impostiamo il valore dell'URI di destinazione
                                        URI targetUri = new URI("www.qualcosa.it");
                                        request.setURI(targetUri);
                                        // A questo punto invochiamo il server
                                        httpClient.execute(request, myResponseHandler);
                                } catch (Exception e) {
                                        Log.e(LOG_TAG, e.getMessage());
                                }
                        }
                });            
                // Avviamo il thread
                workerThread.start();
        }
       
        private final ResponseHandler<String> myResponseHandler = new ResponseHandler<String>() {

                @Override
                public String handleResponse(HttpResponse response)
                                throws ClientProtocolException, IOException {
                        // Estraiamo il risultato dalla risposta. Otteniamo quindi il content
                        // da cui leggere le informazioni
                        InputStream content = response.getEntity().getContent();
                        byte[] buffer = new byte[1024];
                        int numRead = 0;
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        while((numRead=content.read(buffer))!=-1){
                                baos.write(buffer, 0, numRead);
                        }
                        // Chiudiamo lo stream
                        content.close();
                        // Otteniamo il risultato
                        String result = new String(baos.toByteArray());

                        Message messageToSend = myHandler.obtainMessage();
                        messageToSend.obj = result;
                        myHandler.sendMessage(messageToSend);
                       
                        return result;
                }

        };
       
        private final void releaseHttpClient(){
                if(httpClient!=null && httpClient.getConnectionManager()!=null){
                        // Se esiste il ConnectionManager del client lo chiudiamo
                        httpClient.getConnectionManager().shutdown();
                        Log.i(LOG_TAG,"Releasing Connections");
                }
        }
       
       

}

Mentre questo è l'oggetto che implementa l'interfaccia TabContentFactory necessaria per la realizzazione del contenuto del Tab
Codice (Java): [Seleziona]
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.TabHost.TabContentFactory;

public class MyTabContent implements TabContentFactory {

        // Riferimento al Context
        private Context context;
        private String json;

        public MyTabContent(Context context, String json) {
                this.context = context;
                this.json = json;
        }

        @Override
        public View createTabContent(String tag) {
                final TextView textView = new TextView(context);
                Log.i("MyTabContentFactory", "createTabContent");
                // Impostiamo come testo la data corrente
                textView.setText(json);
                // La ritorniamo
                return textView;
        }
}

Questo è il logcat
Codice: [Seleziona]
10-10 09:35:11.812: WARN/dalvikvm(339): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
10-10 09:35:11.830: ERROR/AndroidRuntime(339): FATAL EXCEPTION: main
10-10 09:35:11.830: ERROR/AndroidRuntime(339): java.lang.RuntimeException: Unable to start activity ComponentInfo{mioProgetto/mioPackage.NewsActivity}: java.lang.ClassCastException: android.app.Application
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at android.os.Looper.loop(Looper.java:123)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at android.app.ActivityThread.main(ActivityThread.java:4627)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at java.lang.reflect.Method.invokeNative(Native Method)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at java.lang.reflect.Method.invoke(Method.java:521)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at dalvik.system.NativeStart.main(Native Method)
10-10 09:35:11.830: ERROR/AndroidRuntime(339): Caused by: java.lang.ClassCastException: android.app.Application
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at mioProgetto.NewsActivity.onCreate(NewsActivity.java:39)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
10-10 09:35:11.830: ERROR/AndroidRuntime(339):     ... 11 more
10-10 09:35:11.850: WARN/ActivityManager(60):   Force finishing activity mioPackage/.NewsActivity
10-10 09:35:12.350: WARN/ActivityManager(60): Activity pause timeout for HistoryRecord{45031e10 mioProgetto/.NewsActivity}
10-10 09:35:18.761: DEBUG/dalvikvm(191): GC_EXPLICIT freed 164 objects / 12016 bytes in 144ms
10-10 09:35:23.281: WARN/ActivityManager(60): Activity destroy timeout for HistoryRecord{45031e10 mioProgetto/.NewsActivity}
10-10 09:35:23.821: DEBUG/dalvikvm(262): GC_EXPLICIT freed 249 objects / 11968 bytes in 142ms


Sono due giorni che ci sbatto la testa e non ne vengo a capo.
« Ultima modifica: 10 Ottobre 2011, 11:40:02 CEST da wino_7 »

Offline wino_7

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy s
  • Play Store ID:
    Francesco Di Iorio
  • Sistema operativo:
    Windows 7, Debian
Re:TabHost e recupero info dal web
« Risposta #1 il: 10 Ottobre 2011, 12:21:20 CEST »
0
Aggiornamento!!!
Mi ero dimenticato di inserire nell'android manifest il nome dell'application nell'oggetto Application.
Ora parte ma quando faccio la
Codice (Java): [Seleziona]
httpClient.execute(request, myResponseHandler);vengo catapultato nella clausola catch(Exception), ma non riesco a capire da cosa è causata.

Offline wino_7

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy s
  • Play Store ID:
    Francesco Di Iorio
  • Sistema operativo:
    Windows 7, Debian
Re:TabHost e recupero info dal web
« Risposta #2 il: 10 Ottobre 2011, 17:13:42 CEST »
0
Ragazzi per la miseria è davvero frustrante programmare su android poichè (almeno per quanto mi riguarda) non si riesce mai ad avere sottocontrollo il flusso del programma dovendo prestare attenzioni a troppi file.
Infatti il codice non solo è corretto sintatticamente ma anche funzionante, avevo semplicemente dimenticato di inserire nel file AndroidManifest.xml
la seguente istruzione
Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.INTERNET"></uses-permission>Quindi topic risolto!!!

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:TabHost e recupero info dal web
« Risposta #3 il: 10 Ottobre 2011, 21:48:40 CEST »
0
Credo che gli stessi problemi li hai anche se sviluppi in altri linguaggi. :-)
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .