Autore Topic: Errore con Android 4.3 che non riesco a scovare...  (Letto 908 volte)

Offline Pacobillo

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus one
  • Sistema operativo:
    Windows 7
Errore con Android 4.3 che non riesco a scovare...
« il: 08 Ottobre 2013, 00:20:44 CEST »
0
Ho fatto una activity e, per evitare di cadere nel problema dell'onCreate troppo pesante (che causa errore da android 3.0 in poi), ho messo tutto in un AsyncTask.
Però continua a non funzionare su versioni recenti, e non capisco davvero cosa possa sbagliare... (e cosi sarà una cavolata.. :) ).
Ho notato che se metto il "codice maledetto" che non si dovrebbe usare, ovvero:

Codice (Java): [Seleziona]
if (android.os.Build.VERSION.SDK_INT > 9) {
                        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                        StrictMode.setThreadPolicy(policy);
                }

Tutto funziona.
Ovviamente non vorrei usarlo, ma non so come ovviare, non trovando il problema...
Ecco il codice:

Codice (Java): [Seleziona]
package com.tdgpisa;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;

import org.json.JSONArray;

import com.tdgpisa.db.Database;
import com.tdgpisa.db.sGiochi;

import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

public class CreaTavolo extends ListActivity
{
        TextView gioco;
        int codicegioco;
        static String data;
        private Button salva;
        private int year;
        private int month;
        private int day;
        static final int DATE_DIALOG_ID = 999;

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.creatavolo);
               
/*              if (android.os.Build.VERSION.SDK_INT > 9) {
                        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                        StrictMode.setThreadPolicy(policy);
                }*/

               
                gioco = (TextView) findViewById(R.id.gioco);
                salva = (Button) findViewById(R.id.salva);
               
                asincrona myasincrona = new asincrona();
                myasincrona.execute(null,null);

        }

        // display current date
        public void setCurrentDateOnView() {

                final Calendar c = Calendar.getInstance();
                year = c.get(Calendar.YEAR);
                month = c.get(Calendar.MONTH);
                day = c.get(Calendar.DAY_OF_MONTH);
                // set current date into datepicker

        }

        public void addListenerOnButton() {

                salva.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                                showDialog(DATE_DIALOG_ID);

                        }

                });

        }

        @Override
        protected Dialog onCreateDialog(int id) {
                switch (id) {
                case DATE_DIALOG_ID:
                        // set date picker as current date
                        return new DatePickerDialog(this, datePickerListener,year, month,day);
                }
                return null;
        }

        private DatePickerDialog.OnDateSetListener datePickerListener= new DatePickerDialog.OnDateSetListener() {

                // when dialog box is closed, below method will be called.
                public void onDateSet(DatePicker view, int selectedYear,int selectedMonth, int selectedDay) {
                        year = selectedYear;
                        month = selectedMonth;
                        day = selectedDay;
                        data= String.format("%04d-%02d-%02d", year,month+1,day);
                       

                       
                        if(!gioco.getText().equals("")){
                                AlertDialog.Builder builder1 = new AlertDialog.Builder(CreaTavolo.this);
                                builder1.setTitle("CONFERMA CREAZIONE TAVOLO");
                                builder1.setPositiveButton("SI", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                                Database DB = new Database();
                                                DB.creaTavolo(codicegioco,data);
                                               
                                                AlertDialog.Builder builder2 = new AlertDialog.Builder(CreaTavolo.this);
                                                builder2.setTitle("TAVOLO CREATO");
                                                builder2.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                                        public void onClick(DialogInterface dialog, int which) {
                                                                finish();
                                                        }
                                                });
                                                builder2.setMessage("UN TAVOLO DI "+((String) gioco.getText()).toUpperCase()+" PER IL "+data+" E' STATO CREATO!");
                                                AlertDialog msg = builder2.create();
                                                msg.show();
                                        }
                                });
                                builder1.setNegativeButton("NO",null);
                                builder1.setMessage("SEI SICURO DI VOLER CREARE UN TAVOLO DI "+((String) gioco.getText()).toUpperCase()+" PER IL "+data+"?");
                                AlertDialog ynmsg = builder1.create();
                                ynmsg.show();
                        }
                        else {
                                AlertDialog.Builder builder3 = new AlertDialog.Builder(CreaTavolo.this);
                                builder3.setTitle("DATI MANCANTI");
                                builder3.setPositiveButton("OK", null);
                                builder3.setMessage("SELEZIONARE UN GIOCO!");
                                AlertDialog errorDialog = builder3.create();
                                errorDialog.show();
                        }
                       
                       
                       
                       

                }
        };

        OnItemClickListener clikListaGiochi = new OnItemClickListener()
        {
                @Override
                public void onItemClick(AdapterView<?> listView, View view, int position, long codice)
                {
                        HashMap<String,Object> DATA = (HashMap<String, Object>) listView.getItemAtPosition(position);
                        gioco.setText((CharSequence) DATA.get("GioTit"));
                        codicegioco=(Integer) DATA.get("GioCod");
                }
        };

        private class asincrona extends AsyncTask<String,Void,Void>{

                ArrayList<HashMap<String, Object>> DatiHash;
                ProgressDialog progDailog =  new ProgressDialog(CreaTavolo.this);

                @Override
                protected void onPreExecute() {

                        super.onPreExecute();
                        progDailog.setMessage("Caricamento in corso...");
                        progDailog.setIndeterminate(false);
                        progDailog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                        progDailog.setCancelable(true);
                        progDailog.show();
                }

                @Override
                protected Void doInBackground(String... params) {
                        Database database = new Database();
                        ArrayList<sGiochi> arraygiochi = new ArrayList<sGiochi>();
                        String giochi = database.TuttiGiochiLight();
                        try {
                                JSONArray jsonArray = new JSONArray(giochi);
                                for (int i = 0; i < jsonArray.length(); i++)
                                {
                                        sGiochi singologioco = new sGiochi();
                                        singologioco.setGioCod(jsonArray.getJSONObject(i).getInt("GioCod"));
                                        singologioco.setGioTit(jsonArray.getJSONObject(i).getString("GioTit"));

                                        arraygiochi.add(singologioco);
                                }

                        } catch (Exception e) {

                        }


                        DatiHash = new ArrayList<HashMap<String,Object>>();
                        for(int i=0;i<arraygiochi.size();i++){
                                sGiochi gioco =arraygiochi.get(i);
                                HashMap<String,Object> GiocoMap=new HashMap<String, Object>();
                                GiocoMap.put("GioCod", gioco.getGioCod());
                                GiocoMap.put("GioTit", gioco.getGioTit());
                                DatiHash.add(GiocoMap);
                        };
                        return null;        
                }

                @Override
                protected void onPostExecute(Void result){

                        super.onPostExecute(result);
                        String[] from={"GioTit"};
                        int[] to={R.id.titolo};
                        SimpleAdapter listaGiochi=new SimpleAdapter(getApplicationContext(),DatiHash,R.layout.rigapiccola,from,to);
                        ListView listView = getListView();
                        listView.setAdapter(listaGiochi);
                        listView.setOnItemClickListener(clikListaGiochi);

                        setCurrentDateOnView();
                        addListenerOnButton();

                        progDailog.dismiss();

                        return;
                }
        }
}

Ed ecco l'errore:

Codice: [Seleziona]
10-07 18:12:26.693: E/WindowManager(798): Activity com.tdgpisa.CreaTavolo has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{41814aa0 V.E..... R.....I. 0,0-320,255} that was originally added here
10-07 18:12:26.693: E/WindowManager(798): android.view.WindowLeaked: Activity com.tdgpisa.CreaTavolo has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{41814aa0 V.E..... R.....I. 0,0-320,255} that was originally added here
10-07 18:12:26.693: E/WindowManager(798):         at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
10-07 18:12:26.693: E/WindowManager(798):         at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
10-07 18:12:26.693: E/WindowManager(798):         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
10-07 18:12:26.693: E/WindowManager(798):         at android.app.Dialog.show(Dialog.java:281)
10-07 18:12:26.693: E/WindowManager(798):         at com.tdgpisa.CreaTavolo$1.onDateSet(CreaTavolo.java:131)
10-07 18:12:26.693: E/WindowManager(798):         at android.app.DatePickerDialog.tryNotifyDateSet(DatePickerDialog.java:148)
10-07 18:12:26.693: E/WindowManager(798):         at android.app.DatePickerDialog.onClick(DatePickerDialog.java:116)
10-07 18:12:26.693: E/WindowManager(798):         at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
10-07 18:12:26.693: E/WindowManager(798):         at android.os.Handler.dispatchMessage(Handler.java:99)
10-07 18:12:26.693: E/WindowManager(798):         at android.os.Looper.loop(Looper.java:137)
10-07 18:12:26.693: E/WindowManager(798):         at android.app.ActivityThread.main(ActivityThread.java:5103)
10-07 18:12:26.693: E/WindowManager(798):         at java.lang.reflect.Method.invokeNative(Native Method)
10-07 18:12:26.693: E/WindowManager(798):         at java.lang.reflect.Method.invoke(Method.java:525)
10-07 18:12:26.693: E/WindowManager(798):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-07 18:12:26.693: E/WindowManager(798):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-07 18:12:26.693: E/WindowManager(798):         at dalvik.system.NativeStart.main(Native Method)

Qualcuno sa darmi una dritta?
Grazie!!!!!!!!!
Roberto

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:Errore con Android 4.3 che non riesco a scovare...
« Risposta #1 il: 08 Ottobre 2013, 01:21:39 CEST »
0
Quando succede ? Sempre? O magari dopo una rotazione?

Prova a chiamare il dismiss() su tutte le Dialog quando la tua Activity  va nel onPause() o onDestroy().

Offline Pacobillo

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus one
  • Sistema operativo:
    Windows 7
Re:Errore con Android 4.3 che non riesco a scovare...
« Risposta #2 il: 08 Ottobre 2013, 11:24:52 CEST »
0
Lo fa sempre, ma non viene generato un crash, va fino in fondo.
Mi sono accorto dell'errore perche non inseriva niente nel db...
Nel frattempo ho infarcito il codice di log, per vedere cosa accadeva ed ho scovato che il problema del db (ammesso che non siano due problemi separati) è in questa riga:

Codice (Java): [Seleziona]
HttpResponse response = client.execute(httpPost);
Il codice completo della connessione:

Codice (Java): [Seleziona]
        public void creaTavolo(int codice, String data) {
                String result = "";
                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                Log.d("db","1");

                nameValuePairs.add(new BasicNameValuePair("data",data));
                nameValuePairs.add(new BasicNameValuePair("codice",Integer.toString(codice)));
                Log.d("db","2");
                try{
                        HttpClient client = new DefaultHttpClient();
                        Log.d("db","3");
                        HttpPost httpPost = new HttpPost("http://www.pisacon.it/INSERISCITAVOLO.php");
                        Log.d("db","4");
                        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        Log.d("db","5");
                        HttpResponse response = client.execute(httpPost);
                        Log.d("db","6");
                        HttpEntity entity = response.getEntity();
                        Log.d("db","7");
                        result = EntityUtils.toString(entity);
                        Log.d("db","8");
                }catch(Exception e){
                        Log.e("log_tag", "Error in http connection "+e.toString());
                }

                if (result.compareTo("SUCCESS")== 0) {
                        Log.d("ok", result);
                }else{
                        Log.d("errore", result);
                }

        }

Ma il tutto è ancora più nebuloso..

1) Come mai va in errore con android 4.3 e non con 2.3?
2) Perchè se imposto la StrictMode.ThreadPolicy funziona?
3) La spatafiata di errori a fine esecuzione (appaiono dopo il finish()) c'entrano qualcosa? E in caso contrario...cosa indicano?

Spero che possiate aiutarmi, la mia esperienza non mi permette di andare oltre questo.. :)
Grazie ancora
Roberto

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:Errore con Android 4.3 che non riesco a scovare...
« Risposta #3 il: 08 Ottobre 2013, 11:42:31 CEST »
0
l'errore sta nel fatto che creaTavolo NON è in un async task.
Tu avvii nell'oncreate un async task che sostanzialmente non fa nulla (legge un json?), poi avvi un dialog e da li fai una chiamata HTTP (quindi nel thread UI), questo ti fa generare quell'eccezione, che non è dovuta alla versione di android (o meglio, viene sollevata solo nelle versioni nuove di android), ma dal fatto che TU sbagli a fare la chiamata.

Gli altri errori sono leaked windows, quindi qualcosa che lasci aperto in giro, ma questo problema, per il momento, è secondario.
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 Pacobillo

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus one
  • Sistema operativo:
    Windows 7
Re:Errore con Android 4.3 che non riesco a scovare...
« Risposta #4 il: 08 Ottobre 2013, 11:52:25 CEST »
0
Allora devo aver capito male qualcosa io...
Credevo che il problema del "troppo carico" fosse solo all'apertura dell'activity, quando android per evitare di far apparire la schermata di "non risponde", dalle versioni successive alla 3, generava errori.
Ma ora mi dici che questo problema c'è per tutta la durata dell'activity?
Mamma mia se è stringente...vuol dire che il modo giusto di programmare è fare async task per tutto tutto?
Mi angoscia un pò.. :)
In ogni caso..grazie davvero per la risposta, non ci sarei arrivato!

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:Errore con Android 4.3 che non riesco a scovare...
« Risposta #5 il: 08 Ottobre 2013, 12:34:04 CEST »
+1
Allora devo aver capito male qualcosa io...
Credevo che il problema del "troppo carico" fosse solo all'apertura dell'activity, quando android per evitare di far apparire la schermata di "non risponde", dalle versioni successive alla 3, generava errori.
Ma ora mi dici che questo problema c'è per tutta la durata dell'activity?
Mamma mia se è stringente...vuol dire che il modo giusto di programmare è fare async task per tutto tutto?
Mi angoscia un pò.. :)
In ogni caso..grazie davvero per la risposta, non ci sarei arrivato!
è la base della programmazione Grafica e Multithreading. Se fai chiamate bloccanti nel thread UI ti si blocca l'interfaccia grafica. Se android fosse fatto cosi, faresti due tap ogni 30 minuti
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 Pacobillo

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus one
  • Sistema operativo:
    Windows 7
Re:Errore con Android 4.3 che non riesco a scovare...
« Risposta #6 il: 08 Ottobre 2013, 12:54:19 CEST »
0
Grazie ancora, da oggi in poi async task a manetta... :)
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:Errore con Android 4.3 che non riesco a scovare...
« Risposta #7 il: 08 Ottobre 2013, 22:42:15 CEST »
+1
Grazie ancora, da oggi in poi async task a manetta... :)
Grazie!

Scusa ma dal primo codice non avevo visto la chiamata http fatta nel main thread.
Come già ti ha detto @Nicola non devi eseguire istruzioni che impiegano troppo tempo nel main thread UI.
La videata mentre esegui queste istruzioni è bloccata ( e dopo un po viene chiusa automaticamente da Android).
Il fatto che nella versione 2.3 di Android fosse non bloccata, non significa che era giusta...

Detto questo non significa che la programmazione android si riduce a solo e sempre Async Task.
Dipende da cosa devi fare.
Per elaborazioni lunghe nemmeno l'async task è adeguato per esempio.

Offline Pacobillo

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus one
  • Sistema operativo:
    Windows 7
Re:Errore con Android 4.3 che non riesco a scovare...
« Risposta #8 il: 08 Ottobre 2013, 23:22:47 CEST »
0
Mi sapresti indicare alternative all'async task?
Sono in fase di apprendimento e male non mi farà studiare qualcosa di nuovo... :)
Grazie!
Roberto

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:Errore con Android 4.3 che non riesco a scovare...
« Risposta #9 il: 09 Ottobre 2013, 08:04:28 CEST »
+1
Mi sapresti indicare alternative all'async task?
Sono in fase di apprendimento e male non mi farà studiare qualcosa di nuovo... :)

Thread : [medio] Introduzione ai Thread - Android Developers Italia

AsyncTask : [facile] HttpBookSearch: AsyncTask, HttpClient, XML parsing, ProgressDialog - Android Developers Italia
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Pacobillo

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus one
  • Sistema operativo:
    Windows 7
Re:Errore con Android 4.3 che non riesco a scovare...
« Risposta #10 il: 09 Ottobre 2013, 12:43:59 CEST »
0
Passo a studiare i thread!! ;)
Grazie!