Autore Topic: Eccezione Post  (Letto 1332 volte)

Offline filipposapo

  • Utente junior
  • **
  • Post: 135
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Tablet Samsung Note 10.1
  • Sistema operativo:
    Windows 8
Eccezione Post
« il: 24 Settembre 2013, 17:15:40 CEST »
0
Salve a tutti.
Nel realizzare un'applicazione che ha un main e dei button che aprono altre activity ho incontrato il seguente problema:
alla pressione di due dei 7 tasti sulla home si deve verificare una chiamata post.
A volte e sottolineo a volte questa non funziona e nel log appare on main thread exception, mentre altre volte tutto funziona correttamente. Sapreste dirmi come mai??
Grazie

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:Eccezione Post
« Risposta #1 il: 24 Settembre 2013, 18:06:27 CEST »
0
Se posti il logcat e il codice, qualcuno di noi può provarci.

Offline filipposapo

  • Utente junior
  • **
  • Post: 135
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Tablet Samsung Note 10.1
  • Sistema operativo:
    Windows 8
Re:Eccezione Post
« Risposta #2 il: 25 Settembre 2013, 11:17:37 CEST »
0
questo è il main che in esercizi e statistics c'è la chiamata a SelectionExercise.Scarica(); che ho postato nel secondo spazio di codice.
Codice (Java): [Seleziona]
public void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.home);
               
                if(BluetoothAdapter.getDefaultAdapter() == null) {
                Toast.makeText(this, "Device does not support Bluetooth\nExiting...", Toast.LENGTH_LONG).show();
                finish();
        }
               
                IntentMailBox.content.clear();
               
        }
       
        @Override
    public void onStart() {
        super.onStart();
        if(!BluetoothAdapter.getDefaultAdapter().isEnabled()) {        
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }
    }
       
        public void exercise_click(View view){
                SelectionExercise.Scarica();
                exerciseI = new Intent(this,ConnectActivity.class);
                startActivity(exerciseI);
               
        }
       
        public void contacts_click(View view){
                contacts = new Intent(this,ContactActivity.class);
                startActivity(contacts);
        }
       
        public void tutoring_click(View view){
                tutoring = new Intent(this,TutoringActivity.class);
                startActivity(tutoring);
        }
       
        public void diary_click(View view){
                diary = new Intent(this,CalendarActivity.class);
                startActivity(diary);
        }
       
        public void statistics_click(View view){
                SelectionExercise.Scarica();
                statistics = new Intent(this,StatisticsActivity.class);
               
                startActivity(statistics);
        }
       
        public void program_click(View view){
                program = new Intent(this,CalendarActivity.class);
                startActivity(diary);    
        }
       
        public void feedback_click(View view){
                feedback = new Intent(this,FeedbackActivity.class);
                startActivity(feedback);
        }
        public void exit(View view){
                finish();
                System.exit(0);
        }

Codice (Java): [Seleziona]
public class SelectionExercise {
       
       
         public static void Scarica(){
             
         try{    
             URL server = new URL("http://x.x.x.x:xxxx/Fxxxxx/xxxxxxxi/50/exercise.xml");
             BufferedReader in = new BufferedReader(
                         new InputStreamReader(
                         server.openStream()));
 
             String inputLine;
             Context mContext = null;
                        ManageFile manage = new ManageFile(mContext);
                        File f = new File(Environment.getExternalStorageDirectory().getAbsoluteFile()+"/com.fisio");           
                        String filename =  "exercise.xml";
                        manage.DeleteFile(filename, f);
             while ((inputLine = in.readLine()) != null){
                 System.out.println(inputLine);
                 Context mContext1 = null;
                        ManageFile manage1 = new ManageFile(mContext1);                        
                        manage.WriteFileAppend(inputLine,filename,f)
             }    
                 in.close() ;    
         }catch(Exception e){
                 Log.e("log_tag", "error post "+e.toString());
         }
         }
}

Per il logcat la linea di errore è
Codice: [Seleziona]
error post  on main thread exception.

Che ne pensate??

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:Eccezione Post
« Risposta #3 il: 25 Settembre 2013, 15:32:41 CEST »
0

Per il logcat la linea di errore è
Codice: [Seleziona]
error post  on main thread exception.


Se sostituisci questa riga
Codice (Java): [Seleziona]
Log.e("log_tag", "error post "+e.toString());
con

Codice (Java): [Seleziona]
Log.e("log_tag", "error post "+e.toString(),e);
avrai il logcat completo.

Quasi sicuramente hai una NetworkOnMainThreadException, o ti manca qualche permesso.
Se è la NetworkOnMainThreadException è perchè stai facendo una chiamata internet nel Thread Main UI, e non è permesso (di fatto inchiodi la videata fino a che non è terminata l'esecuzione del codice).

Alcune cose:
Codice (Java): [Seleziona]
SelectionExercise.Scarica();per convenzione in java i metodi sono minuscoli.

Questo codice:
Codice (Java): [Seleziona]
   
       public void exit(View view){
                finish();
                System.exit(0);
        }
mi fa pensare che hai messo un pulsanti esci.
Toglilo, in Android non si usa.

Questo codice
Codice (Java): [Seleziona]
        if(BluetoothAdapter.getDefaultAdapter() == null) {
                Toast.makeText(this, "Device does not support Bluetooth\nExiting...", Toast.LENGTH_LONG).show();
                finish();
        }
chiude l'app subito dopo il toast.
Non è esattamente il massimo chiudere l'app con il finish(). L'utente vedrà il Toast e l'app chiusa.

Codice (Java): [Seleziona]
   @Override
    public void onStart() {
        super.onStart();
        if(!BluetoothAdapter.getDefaultAdapter().isEnabled()) {        
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }
    }

Forse è meglio spostarlo nel onResume()

Offline filipposapo

  • Utente junior
  • **
  • Post: 135
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Tablet Samsung Note 10.1
  • Sistema operativo:
    Windows 8
Re:Eccezione Post
« Risposta #4 il: 25 Settembre 2013, 15:37:39 CEST »
0
Grazie per i tuoi preziosi consigli, l'eccezione è proprio quella solo che non ho capito come devo risolverla perchè quello che io prendo tramite la post è ciò che mi serve per generare la videata.

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:Eccezione Post
« Risposta #5 il: 25 Settembre 2013, 15:47:23 CEST »
+1
Devi inserire la chiamata ad internet e la sua elaborazione successiva in un Thread, un AsyncTask.... 

Offline filipposapo

  • Utente junior
  • **
  • Post: 135
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Tablet Samsung Note 10.1
  • Sistema operativo:
    Windows 8
Re:Eccezione Post
« Risposta #6 il: 26 Settembre 2013, 14:40:50 CEST »
0
ho seguito i tuoi consigli mettendo la chiamata post in un Async task.
Ho esploso anche il log il problema è ancora presente in maniera random (come prima, cioè a vote si e altre no).
Ecco il log:
Codice: [Seleziona]
09-26 14:36:50.595: E/SpannableStringBuilder(18651): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
09-26 14:36:50.595: E/SpannableStringBuilder(18651): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
09-26 14:36:56.430: E/log_tag(18651): error post android.os.NetworkOnMainThreadException
09-26 14:36:56.430: E/log_tag(18651): android.os.NetworkOnMainThreadException
09-26 14:36:56.430: E/log_tag(18651):         at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.io.IoBridge.connect(IoBridge.java:112)
09-26 14:36:56.430: E/log_tag(18651):         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
09-26 14:36:56.430: E/log_tag(18651):         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
09-26 14:36:56.430: E/log_tag(18651):         at java.net.Socket.connect(Socket.java:842)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpConnection.<init>(HttpConnection.java:76)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
09-26 14:36:56.430: E/log_tag(18651):         at java.net.URL.openStream(URL.java:462)
09-26 14:36:56.430: E/log_tag(18651):         at com.fisiosamsung.data.SelectionExercise.Scarica(SelectionExercise.java:33)
09-26 14:36:56.430: E/log_tag(18651):         at com.fisiosamsung.GUI.MainActivity$TaskAsincrono.onPostExecute(MainActivity.java:126)
09-26 14:36:56.430: E/log_tag(18651):         at com.fisiosamsung.GUI.MainActivity$TaskAsincrono.onPostExecute(MainActivity.java:1)
09-26 14:36:56.430: E/log_tag(18651):         at android.os.AsyncTask.finish(AsyncTask.java:631)
09-26 14:36:56.430: E/log_tag(18651):         at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-26 14:36:56.430: E/log_tag(18651):         at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-26 14:36:56.430: E/log_tag(18651):         at android.os.Handler.dispatchMessage(Handler.java:99)
09-26 14:36:56.430: E/log_tag(18651):         at android.os.Looper.loop(Looper.java:137)
09-26 14:36:56.430: E/log_tag(18651):         at android.app.ActivityThread.main(ActivityThread.java:4921)
09-26 14:36:56.430: E/log_tag(18651):         at java.lang.reflect.Method.invokeNative(Native Method)
09-26 14:36:56.430: E/log_tag(18651):         at java.lang.reflect.Method.invoke(Method.java:511)
09-26 14:36:56.430: E/log_tag(18651):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
09-26 14:36:56.430: E/log_tag(18651):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
09-26 14:36:56.430: E/log_tag(18651):         at dalvik.system.NativeStart.main(Native Method)


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:Eccezione Post
« Risposta #7 il: 26 Settembre 2013, 15:05:03 CEST »
0
vuol dire che non hai fatto tutto quello che dovevi fare. Fai delle chiamate HTTP fuori dall'async task. Il fatto che è random è dovuto solo al tuo codice :D
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 filipposapo

  • Utente junior
  • **
  • Post: 135
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Tablet Samsung Note 10.1
  • Sistema operativo:
    Windows 8
Re:Eccezione Post
« Risposta #8 il: 26 Settembre 2013, 15:16:57 CEST »
0
Scusami ma non ho capito cosa hai detto.
Dovrei fare la chiamata http prima di entrare nell'Asink task?
E il fatto che dipenda dal mio codice che cosa vuol dire? che a volte mi trovo nel thread principale e altre volte no?

Post unito: 26 Settembre 2013, 15:29:35 CEST
ho riletto meglio il messaggio e ho capito quello che vuoi dire: in pratica io faccio delle chiamate http fuori dall'Async task e quindi dovrei farle tutte li dentro..ok cerco di vedere se riesco a risolvere.
Grazie
« Ultima modifica: 26 Settembre 2013, 15:29:35 CEST da filipposapo, Reason: Merged DoublePost »

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:Eccezione Post
« Risposta #9 il: 26 Settembre 2013, 16:19:09 CEST »
+1
Codice (Text): [Seleziona]
09-26 14:36:56.430: E/log_tag(18651):         at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
09-26 14:36:56.430: E/log_tag(18651):         at java.net.URL.openStream(URL.java:462)
09-26 14:36:56.430: E/log_tag(18651):         at com.fisiosamsung.data.SelectionExercise.Scarica(SelectionExercise.java:33)
09-26 14:36:56.430: E/log_tag(18651):         at com.fisiosamsung.GUI.MainActivity$TaskAsincrono.onPostExecute(MainActivity.java:126)

Leggi bene la documentazione del AsyncTask.
Stai eseguendo una chiamata http nel metodo onPostExecute. Questo metodo, se vai in debug viene cmq eseguito all'interno del MainThreadUI.
Sposta l'elaborazione nel doInBackground

Offline filipposapo

  • Utente junior
  • **
  • Post: 135
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Tablet Samsung Note 10.1
  • Sistema operativo:
    Windows 8
Re:Eccezione Post
« Risposta #10 il: 26 Settembre 2013, 16:28:32 CEST »
0
Grazie sei stato preziosissimo.

Offline filipposapo

  • Utente junior
  • **
  • Post: 135
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Tablet Samsung Note 10.1
  • Sistema operativo:
    Windows 8
Re:Eccezione Post
« Risposta #11 il: 29 Ottobre 2013, 11:09:56 CET »
0
Ho un'altra domanda riferito a questo.
Ho messo il comando che avvia la post in un AsyncTask che viene avviato con la splash.
la post funziona sempre all'avvio e anche se è stata avviata da poco e viene riavviata ma se è aperta da un po' e viene riavviata la post e poi il download non viene effettuato, sapreste dirmi perchè??

Offline filipposapo

  • Utente junior
  • **
  • Post: 135
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Tablet Samsung Note 10.1
  • Sistema operativo:
    Windows 8
Re:Eccezione Post
« Risposta #12 il: 31 Ottobre 2013, 14:52:07 CET »
0
Ho risolto spostandolo dallo splash

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:Eccezione Post
« Risposta #13 il: 31 Ottobre 2013, 16:29:26 CET »
0
Bene, anche se lo splash screen in android non si può proprio vedere...