Autore Topic: Problema visualizzazione immagini  (Letto 1463 volte)

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
Problema visualizzazione immagini
« il: 29 Agosto 2012, 19:56:24 CEST »
0
Ciao a tutti ragazzi,ho creato 2 semplici activity dove dalla prima ho un oggetto Button che mi serve per visualizzare l'immagine di una webcam che è in un'altra activity.Ecco il pezzo di codice del Button della prima activity

Codice: [Seleziona]
     
        Button Webcam = (Button) findViewById(R.id.Webcam);
        Webcam.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent myIntent = new Intent(view.getContext(), Webcam.class);
                startActivity(myIntent);
            }

        });

Il codice della activity Webcam è il seguente

Codice: [Seleziona]


public class Webcam extends Activity{

        private ImageView imgWebcam;
   
        private TextView txtWebcam;

    String url = "http://miosito/webcam.jpg";
       
        public void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.main_webcam);

                        txtWebcam = (TextView)findViewById(R.id.txtWebcam);

                        imgWebcam =(ImageView)findViewById(R.id.imgWebcam);
                       
                       
                        downloadFile(url);
                       


        }
       
        Bitmap bmImgWebcam;

       
        void downloadFile(String fileUrl){
        URL myFileUrl =null;
        try {
        myFileUrl= new URL(fileUrl);
        } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
        try {
        HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
        conn.setDoInput(true);
        conn.connect();
        InputStream is = conn.getInputStream();

        bmImgWebcam = BitmapFactory.decodeStream(is);
        imgWebcam.setImageBitmap(bmImgWebcam);
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
                }
        }

}


L'immagine viene scaricata e visualizzata senza problemi però ho uno sgradevole problema.
Alcune volte dopo aver premuto il button,questo rimane come pigiato e dopo un paio di secondi mi da una schermata nera ma senza che android mi restituisca il classico errore di applicazione che non risponde,e dopo 6-7 secondi mi appare la mia immagine.
Il fatto è che alcune volte lo fa altre no cosi in maniera random e non riesco a capire cosa sia..Quando non si blocca,il caricamento dell'immagine è fulmineo,quindi penso il metodo che ho usato sia valido..
Oppure c'è un altro approccio che viene usato per visulizzare immagini?
Grazie ragazzi per il vostro aiuto
« Ultima modifica: 29 Agosto 2012, 20:05:25 CEST da bombolo88 »

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 visualizzazione immagini
« Risposta #1 il: 31 Agosto 2012, 07:46:14 CEST »
0
Il problema è che hai messo il download all'interno del metodo OnCreate. Non si deve fare. Devi usare un AsyncTask (o Thread) indipendente per gli accessi alla rete ed in generale per tutte le attività che durano "secondi".
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
Re:Problema visualizzazione immagini
« Risposta #2 il: 31 Agosto 2012, 08:15:22 CEST »
0
Grazie mille bradipao,infatti ho seguito il tuo tutorial che mi hai consigliato sull'altro thread ed a quanto ho capito il mio approccio è sbagliato e devo usare gli asynctask che sono perfetti per fare queste operazioni che durano del tempo e bloccano la UI.
Non ho però ben capito come implementarli,cioè dove metto il mio metodo che mi scarica le immagini.Ne ho capito la struttura cioè doInBackground onProgressUpdate ed onPostExecute ma non riesco ad implementarla.Ti faccio vedere il mio codice completo,semplicemente scarico delle immagini e le mostro nella stessa activity chiamando il metodo downloadFile che quindi non deve essere eseguito in quel punto ma con gli asyncatask,ma come però?

Codice: [Seleziona]
public class Webcam extends Activity{

        private ImageView imgWebcam;
   
        private TextView txtWebcam;

    String url = "http://miosito.it/webcam.jpg";
       
        public void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.main_webcam);

                        txtWebcam = (TextView)findViewById(R.id.txtWebcam);

                        imgWebcam =(ImageView)findViewById(R.id.imgWebcam);
                       
                       
                        downloadFile(url);
                       


        }
       
        public boolean onCreateOptionsMenu(Menu menu) {
            menu.add("Webcam1").setOnMenuItemClickListener(new OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                            downloadFile("http://miosito.it/Webcam1.jpg");
                            txtWebcam.setText("Webcam1");
                            return true;
                    }
            });;
            menu.add("Webcam2").setOnMenuItemClickListener(new OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                            downloadFile("http://miosito.it/Webcam2.jpg");
                            txtWebcam.setText("Webcam2");
                            return true;
                    }
            });;
            return true;
        }
        Bitmap bmImgWebcam;

       
        void downloadFile(String fileUrl){
        URL myFileUrl =null;
        try {
        myFileUrl= new URL(fileUrl);
        } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
        try {
        HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
        conn.setDoInput(true);
        conn.connect();
        InputStream is = conn.getInputStream();

        bmImgWebcam = BitmapFactory.decodeStream(is);
        imgWebcam.setImageBitmap(bmImgWebcam);
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
                }
        }

}
« Ultima modifica: 31 Agosto 2012, 08:17:21 CEST da bombolo88 »

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 visualizzazione immagini
« Risposta #3 il: 31 Agosto 2012, 08:42:24 CEST »
+1
Scrivo a parole perchè in questo momento ho problemi di "copia e incolla".

I due metodi essenziali che ti occorrono sono doInBackground e onPostExecute. La sequenza delle operazioni è molto semplice ed è questa:
1) Nella onclick del Button, crei il tuo AsyncTask e ne fai .start()
2) Nella doInBackground esegui tutte le operazioni di rete (in pratica richiami o copi la tua downloadurl)
    ...il thread esegue autonomamente lo scaricamento...
3) Quando ha terminato, viene automaticamente eseguita la onPostExecute, nella quale fai le modifiche alla schermata ell'activity (esempio visualizzi l'immagine scaricata).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
Re:Problema visualizzazione immagini
« Risposta #4 il: 31 Agosto 2012, 08:47:14 CEST »
0
PErfetto!!provo ad implementarlo,in questo modo quindi potrò anche usare il progressdialog!ti tengo aggiornato grazie mille  ;-) ;-)

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
Re:Problema visualizzazione immagini
« Risposta #5 il: 31 Agosto 2012, 09:21:58 CEST »
0
Ci sono quasi!PErò mi crasha l'app dopo che clicco sul bottone del menu,mi compare il progressdialog di caricamento e subito dopo crasha!
Ho impostato i parametri di tipo void dato che non deve ritornarmi nessuna stringa ma in dobackground devo solo richiamare il metodo di download del file..cosa è che sbaglio?

Codice: [Seleziona]
public class Radar extends Activity{
       
        private ImageView imgGraph;
   
        private TextView txtGraph;

    private ProgressDialog pd;

    String img= "http://miosito.it/image.jpg";
   
       
        public void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.main_radar);

                        txtGraph = (TextView)findViewById(R.id.txtGraph);
                       
                        imgGraph =(ImageView)findViewById(R.id.imgGraph);               

        }
       
        public boolean onCreateOptionsMenu(Menu menu) {
            menu.add("webcam").setOnMenuItemClickListener(new OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                pd = ProgressDialog.show(Radar.this,"carico","Connecting...",true,false);
                AsTask task = new AsTask();
                task.execute();
                            txtGraph.setText("Webcam");
                            return true;
                    }
            });;
            return true;
        }
       
        Bitmap bmImgGraph;

        private class AsTask extends AsyncTask<Void,Void,Void> {
                @Override
                protected Void doInBackground(Void... params) {
                        // TODO Auto-generated method stub
                downloadFile(img);                                     
                        return null;
                }
                protected void onProgressUpdate(Void... values) {
                 // aggiorno la progress dialog
                 pd.setMessage("download");
              }
                 protected void onPostExecute(Void result) {
                 // chiudo la progress dialog
                 pd.dismiss();
                 }

               
        }
       
        void downloadFile(String fileUrl){
        URL myFileUrl =null;
        try {
        myFileUrl= new URL(fileUrl);
        } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
        try {
        HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
        conn.setDoInput(true);
        conn.connect();
        InputStream is = conn.getInputStream();

        bmImgGraph = BitmapFactory.decodeStream(is);
        imgGraph.setImageBitmap(bmImgGraph);
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
                }
        }
       
       
       
       

}

       

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 visualizzazione immagini
« Risposta #6 il: 31 Agosto 2012, 09:31:44 CEST »
0
A occhio perchè questo:

Codice (Java): [Seleziona]
imgWebcam.setImageBitmap(bmImgWebcam);
...come qualsiasi operazione che tocca la user-interface, devi metterla in OnPostExecute.

Comunque guarda cosa dice il LogCat in merito all'errore.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
Re:Problema visualizzazione immagini
« Risposta #7 il: 31 Agosto 2012, 19:27:13 CEST »
0
Funziona!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Grazie mille!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ho fatto anche il passaggio del parametro nell'asynktask per scaricare l'url che voglio e funziona,però volevo sapere se era il modo corretto!Ora però ho un ultimo prob cioè mi servirebbe il parametro anche nell'onpostexecute per aggiornar eil testo in base all'url scaricato ma non riesco a capire come farlo.....

Codice: [Seleziona]
   public boolean onCreateOptionsMenu(Menu menu) {
            menu.add("midia").setOnMenuItemClickListener(new OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                pd = ProgressDialog.show(Radar.this,"carico","Connecting...",true,false);
                AsTask task = new AsTask();
                task.execute("url1");
               return true;
                    }
            });
            menu.add("himet").setOnMenuItemClickListener(new OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                pd = ProgressDialog.show(Radar.this,"carico","Connecting...",true,false);
                AsTask task = new AsTask();
                task.execute("url2");
               return true;
                    }
            });;

E l'asynctask è cosi fatta

Codice: [Seleziona]
        private class AsTask extends AsyncTask<String,Void,Void> {
                @Override
                protected Void doInBackground(String... params) {
                        // TODO Auto-generated method stub

                   String v = params[0];

                   if(v == "url1"){
                   downloadFile(midia);
                 }
                    if(v == "url2"){
                    downloadFile(himet);
                }                                     
                        return null;
                }
                protected void onProgressUpdate(Void... values) {
                 // aggiorno la progress dialog
                 pd.setMessage("download");
              }
                 protected void onPostExecute(Void result) {
                 // chiudo la progress dialog
                         imgGraph.setImageBitmap(bmImgGraph);
                         txtGraph.setText("Radar Monte Midia 120km");
                 pd.dismiss();
                 }

               
        }
« Ultima modifica: 01 Settembre 2012, 01:16:02 CEST da bombolo88 »

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
R: Problema visualizzazione immagini
« Risposta #8 il: 03 Settembre 2012, 10:12:03 CEST »
0
Non si può fare?

Inviato dal mio GT-S5570 usando Tapatalk