Autore Topic: Problema nel visualizzare un Imageview caricata da url  (Letto 660 volte)

Offline bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Problema nel visualizzare un Imageview caricata da url
« il: 18 Aprile 2014, 14:39:30 CEST »
0
Ciao ragazzi avrei un semplice problema da esporvi.
Ho fatto una semplice activity che oltre a visualizzare del testo, visualizza una semplice imageView (caricata da un url).
Con le API 8 non ho mai avuto problemi, ma quando ho riprogettato il tutto utilizzando API 16 è nato il problema.
Vi riporto il codice creato.Nell'onCreate ho dichiarato la mia TextView e il mio ImageVIew:
Codice (Java): [Seleziona]
protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_activity_articolo);
                titolo=(TextView) this.findViewById(R.id.titoloArticolo);
                image=(ImageView) this.findViewById(R.id.immagineArticolo);
        }
mentre qui ho inserito i miei dati da visualizzare:
Codice (Java): [Seleziona]
                                titolo.setText("Prima pagina");
                                Bitmap bimage = getBitmap(dato.getFotoString());
                                image.setImageBitmap(bimage);
Questo è il metodo getBitmap:
Codice (Java): [Seleziona]
public Bitmap getBitmap(String url) {
                        File f=new FileCache(ActivityArticolo.this).getFile(url);
                        try {
                                 Bitmap bitmap=null;
                                URL imageUrl = new URL(url);
                                 HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
                                conn.setConnectTimeout(30000);
                                conn.setReadTimeout(30000);
                                conn.setInstanceFollowRedirects(true);
                                InputStream is=conn.getInputStream();
                                OutputStream os = new FileOutputStream(f);
                                Utils.CopyStream(is, os);
                                 os.close();
                                 bitmap = new ImageLoader(ActivityArticolo.this).decodeFile(f);
                                 return bitmap;
                        } catch (Throwable ex){
                                ex.printStackTrace();
                                return null;
                        }
                }

L'eccezione viene lanciata all'istruzione "InputStream is=conn.getInputStream();".Questo è quello che viene riportato
Codice (Java): [Seleziona]
04-18 14:37:00.321: W/System.err(13860):         android.os.NetworkOnMainThreadException
04-18 14:37:00.331: W/System.err(13860):        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java)
04-18 14:37:00.331: W/System.err(13860):        at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
04-18 14:37:00.351: W/System.err(13860):        at libcore.io.IoBridge.recvfrom(IoBridge.java:506)
04-18 14:37:00.351: W/System.err(13860):        at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
04-18 14:37:00.351: W/System.err(13860):        at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
04-18 14:37:00.371: W/System.err(13860):        at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
04-18 14:37:00.371: W/System.err(13860):        at java.io.InputStream.read(InputStream.java:162)
04-18 14:37:00.381: W/System.err(13860):        at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142)
04-18 14:37:00.381: W/System.err(13860):        at java.io.BufferedInputStream.read(BufferedInputStream.java:227)
04-18 14:37:00.381: W/System.err(13860):        at com.android.okhttp.internal.Util.readAsciiLine(Util.java:316)
04-18 14:37:00.391: W/System.err(13860):        at com.android.okhttp.internal.http.RawHeaders.fromBytes(RawHeaders.java:308)
04-18 14:37:00.391: W/System.err(13860):        at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:135)
04-18 14:37:00.401: W/System.err(13860):        at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:644)
04-18 14:37:00.401: W/System.err(13860):        at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347)
04-18 14:37:00.401: W/System.err(13860):        at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
04-18 14:37:00.401: W/System.err(13860):        at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)

Grazie a tutti per la collaborazione

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:Problema nel visualizzare un Imageview caricata da url
« Risposta #1 il: 18 Aprile 2014, 15:28:27 CEST »
+1
La risposta sta nel nome dell'eccezione, NetworkOnMainThreadException.

Era una pratica deprecata sin dall'inizio, ma più o meno dalle API12 in poi è vietato eseguire operazioni di accesso alla rete, nel main thread (cioè nello stesso thread dell'interfaccia grafica).

Tutte le operazioni di rete devono avvenire in un thread separato, per cui puoi usare i Thread, puoi usare AsyncTask, oppure (opzione molto più usata) utilizzi librerie di accesso alla rete che svolgono tutto il "lavoro sporco" al posto tuo, senza che tu debba reinventare la ruota.

Per una delle più semplici e banali librerie, guarda questo tutorial : [facile] utilizzo della libreria android-async-http - Android Developers Italia
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline bakiko

  • Utente junior
  • **
  • Post: 74
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One
  • Sistema operativo:
    Windows 7
Re:Problema nel visualizzare un Imageview caricata da url
« Risposta #2 il: 23 Aprile 2014, 18:02:12 CEST »
0
La risposta sta nel nome dell'eccezione, NetworkOnMainThreadException.

Era una pratica deprecata sin dall'inizio, ma più o meno dalle API12 in poi è vietato eseguire operazioni di accesso alla rete, nel main thread (cioè nello stesso thread dell'interfaccia grafica).

Tutte le operazioni di rete devono avvenire in un thread separato, per cui puoi usare i Thread, puoi usare AsyncTask, oppure (opzione molto più usata) utilizzi librerie di accesso alla rete che svolgono tutto il "lavoro sporco" al posto tuo, senza che tu debba reinventare la ruota.

Per una delle più semplici e banali librerie, guarda questo tutorial : [facile] utilizzo della libreria android-async-http - Android Developers Italia

Impeccabile come sempre. Ho seguito il tutorial consigliato ed ho risolto il problema utilizzando la libreria Android Asynchronous Http Client....Grazie mille ;)