Autore Topic: Problemi settare immagine ImageView e URL  (Letto 1306 volte)

Offline lz91

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S I-9000
  • Sistema operativo:
    Ubuntu, Windows 7
Problemi settare immagine ImageView e URL
« il: 17 Settembre 2012, 21:22:29 CEST »
0
Ciao ragazzi  :-P

è da un paio di giorni che sto cercando di settare come ImageView un immagine scaricata da Internet.
Ma non capisco il perche' non riesco a farlo.

Ho cercato su google e anche qui nel forum alcune soluzioni ma mi danno lo stesso risultato ogni volta. Mi va in crash l'applicazione.
Allora il codice che uso è questo.

Codice (Java): [Seleziona]
public class MainActivity extends Activity {

        String image_URL="http://4.bp.blogspot.com/_C5a2qH8Y_jk/StYXDpZ9-WI/AAAAAAAAAJQ/sCgPx6jfWPU/S1600-R/android.png";
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        /*ImageView bmImage = (ImageView)findViewById(R.id.imageView1);
        bmImage.setImageResource(R.drawable.paris);*/

       
        ImageView bmImage = (ImageView)findViewById(R.id.imageView1);
        BitmapFactory.Options bmOptions;
        bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;
        Bitmap bm = LoadImage(image_URL, bmOptions);
        bmImage.setImageBitmap(bm);
       
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
   
    private Bitmap LoadImage(String URL, BitmapFactory.Options options)
    {      
     Bitmap bitmap = null;
     InputStream in = null;      
        try {
            in = OpenHttpConnection(URL);
            bitmap = BitmapFactory.decodeStream(in, null, options);
            in.close();
        } catch (IOException e1) {
        }
        return bitmap;              
    }

 private InputStream OpenHttpConnection(String strURL) throws IOException{
  InputStream inputStream = null;
  URL url = new URL(strURL);
  URLConnection conn = url.openConnection();

  try{
   HttpURLConnection httpConn = (HttpURLConnection)conn;
   httpConn.setRequestMethod("GET");
   httpConn.connect();

   if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
    inputStream = httpConn.getInputStream();
   }
  }
  catch (Exception ex)
  {
  }
  return inputStream;
 }
 
}


Come potete vedere ho provato anche settare un immagine che è nel mio progetto con :
Codice (XML): [Seleziona]
ImageView bmImage = (ImageView)findViewById(R.id.imageView1);
        bmImage.setImageResource(R.drawable.paris);
e con questo funziona.
Pero' da URL non mi va.
Ho provato a guardare i LogCat ma non so, non riesco a capire il problema.
LogCat:
Codice: [Seleziona]
09-17 20:54:11.992: D/AndroidRuntime(15022): Shutting down VM

09-17 20:54:11.992: W/dalvikvm(15022): threadid=1: thread exiting with uncaught exception (group=0x40d61300)
09-17 20:54:11.992: E/AndroidRuntime(15022): FATAL EXCEPTION: main
09-17 20:54:11.992: E/AndroidRuntime(15022): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.prova.imageviewurl/com.prova.imageviewurl.MainActivity}: java.lang.NullPointerException
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.app.ActivityThread.access$600(ActivityThread.java:130)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.os.Handler.dispatchMessage(Handler.java:99)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.os.Looper.loop(Looper.java:137)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.app.ActivityThread.main(ActivityThread.java:4745)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at java.lang.reflect.Method.invokeNative(Native Method)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at java.lang.reflect.Method.invoke(Method.java:511)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at dalvik.system.NativeStart.main(Native Method)
09-17 20:54:11.992: E/AndroidRuntime(15022): Caused by: java.lang.NullPointerException
09-17 20:54:11.992: E/AndroidRuntime(15022):         at com.prova.imageviewurl.MainActivity.LoadImage(MainActivity.java:51)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at com.prova.imageviewurl.MainActivity.onCreate(MainActivity.java:33)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.app.Activity.performCreate(Activity.java:5008)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
09-17 20:54:11.992: E/AndroidRuntime(15022):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
09-17 20:54:11.992: E/AndroidRuntime(15022):         ... 11 more

09-17 20:58:06.891: D/dalvikvm(15169): GC_FOR_ALLOC freed 39K, 2% free 10880K/11075K, paused 11ms, total 11ms
09-17 20:58:06.898: I/dalvikvm-heap(15169): Grow heap (frag case) to 11.138MB for 480016-byte allocation



Ovviamente sapendo che devo accedere a Internet ho inserito il permesso :
Codice: [Seleziona]
<uses-permission android:name="android.permission.INTERNET"/>ma non funziona lo stesso.

Qualcuno sa' il perche'?  :-(

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:Problemi settare immagine ImageView e URL
« Risposta #1 il: 18 Settembre 2012, 08:02:39 CEST »
+1
Qualcuno sa' il perche'?  :-(

Citazione
09-17 20:54:11.992: E/AndroidRuntime(15022): Caused by: java.lang.NullPointerException
09-17 20:54:11.992: E/AndroidRuntime(15022):         at com.prova.imageviewurl.MainActivity.LoadImage(MainActivity.java:51)

Alla riga 51 di MainActivity.java qualcosa è null e non dovrebbe. Sembrerebbe uno dei parametri di LoadImage. Prova a "loggare" i valori.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lz91

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S I-9000
  • Sistema operativo:
    Ubuntu, Windows 7
Re:Problemi settare immagine ImageView e URL
« Risposta #2 il: 18 Settembre 2012, 12:51:36 CEST »
0
Ho provato a stampare sia image_URL sia bmOptions con il toString e il risulatato è questo:

LogCat:
Codice: [Seleziona]
..
09-18 12:42:11.824: E/image_URL(9079): http://4.bp.blogspot.com/_C5a2qH8Y_jk/StYXDpZ9-WI/AAAAAAAAAJQ/sCgPx6jfWPU/S1600-R/android.png
09-18 12:42:11.824: E/bmOption(9079): android.graphics.BitmapFactory$Options@4187b780
..

Ho provato a eseguire l'istruzione
Codice (Java): [Seleziona]
Bitmap bm = LoadImage(image_URL, bmOptions);all'interno di una semplice Thread.
E mi funziona.
Avevo letto un po' di tempo fa che tutte le operazione che accedono a internet devono essere fatte all'interno di Thread.
Puo' essere? Non è un po' scomodo fare questo tipo di operazioni all'interno delle thread ? Anche se penso che sia un fatto di sicurezza.
Ma a volte risulta un po scomodo secondo me :)
Ma non ne sono sicuro. Sta di fatto che funziona  :-o .

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:Problemi settare immagine ImageView e URL
« Risposta #3 il: 18 Settembre 2012, 12:53:56 CEST »
+1
all'interno di una semplice Thread.
E mi funziona.
Avevo letto un po' di tempo fa che tutte le operazione che accedono a internet devono essere fatte all'interno di Thread.
Puo' essere? Non è un po' scomodo fare questo tipo di operazioni all'interno delle thread ? Anche se penso che sia un fatto di sicurezza.
Ma a volte risulta un po scomodo secondo me :)

Ecco si, la causa è esattamente questa.

E l'uso di un thread non è dovuto a questioni di sicurezza, ma di performance sui dispositivi mobile. Le operazioni onerose devono essere eseguite in thread separati da quello di UI per non congelare l'interfaccia utente.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lz91

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S I-9000
  • Sistema operativo:
    Ubuntu, Windows 7
Re:Problemi settare immagine ImageView e URL
« Risposta #4 il: 18 Settembre 2012, 13:45:09 CEST »
0
Ok grazie mille  ;-) ... dovro' studiarmi per bene le thread allora dato che il caricamento simultaneo di immagini da URL e veramente lento :)

Da citazione da developer.android
Off-Topic:
Network operations can involve unpredictable delays. To prevent this from causing a poor user experience, always perform network operations on a separate thread from the UI. The AsyncTask class provides one of the simplest ways to fire off a new task from the UI thread. For more discussion of this topic, see the blog post Multithreading For Performance.


A chi si imbatte su questo problema consiglio di leggere qui :
http://developer.android.com/training/basics/network-ops/connecting.html