Autore Topic: Download immagini da server, android.os.NetworkOnMainThreadException.  (Letto 1004 volte)

Offline giupardeb

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy Note 4
Buongiorno ragazzi, attraverso questo topic, Download immagini , audio e video da server web  - Android Developers Italia ho capito più o meno il funzionamento del download da un server. Il mio problema teoricamente è semplice, in pratica vorrei scaricare tutte le immagini che ci sono in una determinata cartella di dropbox, o equivalente in una cartella di un server. È possibile fare ciò ? Spero nel vostro aiuto una buona giornata

UPDATE:

Sono riuscito a creare un codice che dovrebbe funzionare, il codice è questo:

Codice (Java): [Seleziona]
try {
                                File root = android.os.Environment.getExternalStorageDirectory();
                                File dir = new File(root.getAbsolutePath() + "/mnt/sdcard/myimg/img");
                                if(dir.exists() == false){
                                        dir.mkdirs();  
                                }
                                for(int i=0; i<7;i++){
                                        URL url = new URL(DownloadUrl+Tempo[i]);
                                        File file = new File(dir,Tempo[i]);

                                        long startTime = System.currentTimeMillis();
                                        Log.d("DownloadManager" , "download url:" +url);
                                        Log.d("DownloadManager" , "download file name:" + Tempo[i]);

                                        URLConnection uconn = url.openConnection();
                                        uconn.setReadTimeout(7000);
                                        uconn.setConnectTimeout(7000);

                                        InputStream is = uconn.getInputStream();
                                        BufferedInputStream bufferinstream = new BufferedInputStream(is);

                                        ByteArrayBuffer baf = new ByteArrayBuffer(5000);
                                        int current = 0;
                                        while((current = bufferinstream.read()) != -1){
                                                baf.append((byte) current);
                                        }

                                        FileOutputStream fos = new FileOutputStream( file);
                                        fos.write(baf.toByteArray());
                                        fos.flush();
                                        fos.close();
                                        Log.d("DownloadManager" , "download ready in" + ((System.currentTimeMillis() - startTime)/1000) + "sec");
                                        //                                      int dotindex = Tempo[i].lastIndexOf('.');

                                        //                                      if(dotindex>=0) Tempo[i] = Tempo[i].substring(0,dotindex);
                                }
                        }
                        catch(IOException e) {
                                Log.d("DownloadManager" , "Error:" + e);
                        }

purtroppo mi da il seguente errore android.os.NetworkOnMainThreadException.

questo è il logCat completo:

Codice: [Seleziona]
03-16 12:04:00.800: W/dalvikvm(16314): threadid=1: thread exiting with uncaught exception (group=0x41798ce0)
03-16 12:04:00.800: E/AndroidRuntime(16314): FATAL EXCEPTION: main
03-16 12:04:00.800: E/AndroidRuntime(16314): Process: com.example.test, PID: 16314
03-16 12:04:00.800: E/AndroidRuntime(16314): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: android.os.NetworkOnMainThreadException
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.app.ActivityThread.access$800(ActivityThread.java:145)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.os.Handler.dispatchMessage(Handler.java:102)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.os.Looper.loop(Looper.java:136)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.app.ActivityThread.main(ActivityThread.java:5081)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at java.lang.reflect.Method.invokeNative(Native Method)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at java.lang.reflect.Method.invoke(Method.java:515)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at dalvik.system.NativeStart.main(Native Method)
03-16 12:04:00.800: E/AndroidRuntime(16314): Caused by: android.os.NetworkOnMainThreadException
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at java.net.InetAddress.getAllByName(InetAddress.java:214)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.example.test.MainActivity.DownloadImage(MainActivity.java:60)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at com.example.test.MainActivity.onCreate(MainActivity.java:36)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.app.Activity.performCreate(Activity.java:5231)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
03-16 12:04:00.800: E/AndroidRuntime(16314):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
03-16 12:04:00.800: E/AndroidRuntime(16314):         ... 11 more

Potete per favore dirmi come potrei risolvere tale errore? Grazie mille
P.S la linea 60, equivale all'istruzione InputStream is = uconn.getInputStream();
« Ultima modifica: 16 Marzo 2014, 12:22:42 CET da giupardeb »

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Download immagini da server, android.os.NetworkOnMainThreadException.
« Risposta #1 il: 21 Agosto 2014, 09:55:47 CEST »
0
Devi usare la classe ASYNCTASK o dei Service
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Download immagini da server, android.os.NetworkOnMainThreadException.
« Risposta #2 il: 03 Settembre 2014, 10:54:23 CEST »
0
Qui c'è un link che ti può tornare utile

http://www.lucazanini.eu/2012/android/the-android-os-networkonmainthreadexception-exception/?lang=it

io essendo in fase di prototipazione ho risolto mettendo


StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
               .permitAll().build();
         StrictMode.setThreadPolicy(policy);





prima della connessione, ma è sconsigliato come spiegato nell'articolo che ti ho postato.
« Ultima modifica: 03 Settembre 2014, 13:04:06 CEST da Sirio22, Reason: Deprecated read posts down »
Let Your Brain Run Away

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Download immagini da server, android.os.NetworkOnMainThreadException.
« Risposta #3 il: 03 Settembre 2014, 11:45:08 CEST »
+1
Qui c'è un link che ti può tornare utile

http://www.lucazanini.eu/2012/android/the-android-os-networkonmainthreadexception-exception/?lang=it

io essendo in fase di prototipazione ho risolto mettendo

Codice (Java): [Seleziona]
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                                        .permitAll().build();
                        StrictMode.setThreadPolicy(policy);

prima della connessione, ma è sconsigliato come spiegato nell'articolo che ti ho postato.
scusa se te lo dico schiettamente, ma è una porcata e non va assolutamente fatta.
Non costa niente avviare un Thread o un async task e ti prepara già la strada spianata.
per fare questo ci vogliono 30 secondi:
Codice (Java): [Seleziona]
Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                //HttpURLConnection,HttpClient,OkHttp, volley e compagnia bella
                //chiamata web
                //risposta
                //elabora risposta
                NOMEACTIVITY.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("riposta web service: " + responseString);
                    }
                });
            }
        });
t.start();

almeno eviti di bloccare il thread della UI e non istighi l'utente a killare e disinstallare l'app
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Download immagini da server, android.os.NetworkOnMainThreadException.
« Risposta #4 il: 03 Settembre 2014, 12:28:20 CEST »
0
Ma ho anche aggiunto che è una cosa che sconsiglia l'articolo , in cui si dice che va usato l'Async come dici tu.

Come dicevo "in fase di prototipazione" del tipo se hai fretta e vuoi provare altre cose si può usare quella che tu definisci una porcata.

 :D
Let Your Brain Run Away

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Download immagini da server, android.os.NetworkOnMainThreadException.
« Risposta #5 il: 03 Settembre 2014, 12:30:47 CEST »
0
Si si tranquillo, era solo per dire che non va fatto,neanche in prototipazione visto che il tempo di cambiare le thread policy è lo stesso di fare un thread con un runnable
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Download immagini da server, android.os.NetworkOnMainThreadException.
« Risposta #6 il: 03 Settembre 2014, 12:41:11 CEST »
0
Io lo vieterei per legge quel metodo.

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:Download immagini da server, android.os.NetworkOnMainThreadException.
« Risposta #7 il: 03 Settembre 2014, 12:47:50 CEST »
0
Come dicevo "in fase di prototipazione" del tipo se hai fretta e vuoi provare altre cose si può usare quella che tu definisci una porcata.

Il problema, che l'articolo colpevolmente non rivela, è che si sta provando una cosa diversa da quella che si vuol fare, solamente per non conoscenza del metodo corretto (non per "fretta", dato che la quantità di codice è quasi identica).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Download immagini da server, android.os.NetworkOnMainThreadException.
« Risposta #8 il: 03 Settembre 2014, 12:54:06 CEST »
0
Chiedo scusa perchè non conoscevo la nefandezza di quel metodo.
Dovevo testare una connessione a googlemap e utilizzando un Thread o un AsyncTask avrei scritto molto più codice (cosa che comunque ora che ho visto che funziona sto facendo).
Capisco che è una forzatura e torno a chiedere scusa se stavo per portare in errore gli utenti con il mio consiglio.
Vi ringrazio per le precisazioni.

Post unito: [time]03 Settembre 2014, 14:47:18 CEST[/time]
Posto la soluzione seguendo il codice di Nicola_D per chi dovesse averne bisogno:

Il metodo ha come parametri una classe ausiliaria contenente due double che rappresentano longitudine e latitudine
e restituisce un JSONObject inoltre mostra sull'activity principale un Toast


Codice (Java): [Seleziona]
public JSONObject convertLatLngToJSONAddress(LatLng latLngAus) {
                httppost = new HttpPost(
                                "http://maps.googleapis.com/maps/api/geocode/json?latlng="
                                                + latLngAus.latitude + "," + latLngAus.longitude
                                                + "&sensor=true");

                Thread t = new Thread(new Runnable() {
                        @Override
                        public void run() {
                                try {
                                        response = client.execute(httppost);
                                        HttpEntity entity = response.getEntity();
                                        InputStream stream = entity.getContent();
                                        int b;
                                        while ((b = stream.read()) != -1) {
                                                stringBuilder.append((char) b);
                                        }

                                        jsonObject = new JSONObject(stringBuilder.toString());

                                } catch (IOException | NetworkOnMainThreadException
                                                | JSONException e) {
                                        Log.e(TAG,
                                                        "Error convertLatLngToJSONAddress >> "
                                                                        + e.toString());
                                }

//instead of ACTIVITY use the instance of the activity where you want to be shown the method
                                ACTIVITY.runOnUiThread(new Runnable() {
                                                String addressFormatted = "";

                                                        @Override
                                                        public void run() {
                                                                try {
                                                                        addressFormatted = jsonObject
                                                                                        .getJSONArray("results")
                                                                                        .getJSONObject(0)
                                                                                        .getString("formatted_address");

                                                                } catch (JSONException e) {
                                                                        e.printStackTrace();
                                                                        Log.e(TAG,
                                                                                        "Error convertLatLngToJSONAddress >>"
                                                                                                        + e.toString());
                                                                }
                                                                Toast.makeText(
                                                                                Common.getInstance()
                                                                                                .getRemoteControllerActivity(),
                                                                                addressFormatted, Toast.LENGTH_LONG)
                                                                                .show();
                                                        }
                                                });
                        }
                });

                t.start();
                return jsonObject;
        }
« Ultima modifica: 03 Settembre 2014, 17:14:28 CEST da Sirio22 »
Let Your Brain Run Away