Autore Topic: Uncaught handler: thread main exiting due to uncaught exception  (Letto 671 volte)

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Uncaught handler: thread main exiting due to uncaught exception
« il: 20 Settembre 2011, 15:28:16 CEST »
0
ciao a tutti,
ho un problema con la mia nuova applicazione, voglio fare in modo di recuperare tutta la lista dei contatti e mostrarla in una listview.
Il recupero dei contatti avviene tramite un thread (uso un ProgressDialog per tenere in attesa l'utente) e ho quindi creato un handler che ha il compito di aggiornare la grafica (visto che non potevo farlo direttamente dal thread)

Ecco il codice:

Codice (Java): [Seleziona]
public class FiltroSMSActivity extends Activity {
       
        private ProgressDialog dialog;
         Handler mHandler = null;
       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        final ArrayList<String> nome = new ArrayList<String>();
        final ArrayList<String> numero = new ArrayList<String>();
       
        //Dialog che tiene in attesa l'utente fino al completamento del thread
        dialog = new ProgressDialog(FiltroSMSActivity.this);
        dialog.setMessage("Recupero elenco contatti...");
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();
        new Thread(new Runnable(){
                public void run(){
                        //Leggo tutta la rubrica telefonica e salvo in un ArrayList tutti i contatti
               
                 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); //Cursore della rubrica
                 while (cursor.moveToNext()) { //Entro nel ciclo se trovo almeno un contatto
                     try{
                        //Recupero tutte le info dell'utente corrente
                     String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                     String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                     String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                     
                     //Se è disponibile almeno un numero di telefono lo recupero
                     if (Integer.parseInt(hasPhone) > 0) {
                         Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);
                         while (phones.moveToNext()) {
                             String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));
                             nome.add(name);
                             numero.add(phoneNumber);                            
                         }
                         phones.close(); //Chiudo la rubrica
                     }
                 }catch(Exception e){}
                }
                 
                 //Chiudo il dialog
                        dialog.dismiss();
                       
                        //Creo un oggetto contenente tutto l'ArrayList così da gestirlo fuori dal thread
                        Message msg = new Message();
                String [] textTochange = new String [nome.size()];
                for (int i=0; i<nome.size();i++)
                        textTochange[i] = nome.get(i)+" :"+numero.get(0)+";";
                msg.obj = textTochange.toString();
                mHandler.sendMessage(msg);

                }
        }).start();

        //Questo hendler gestisce il cambio di grafica partendo dal thread
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                String text = (String)msg.obj;
               
                String [] nome_numero = text.split(";");
               
                ArrayAdapter<Object> arrayAdapter = new ArrayAdapter<Object>(getApplicationContext(),android.R.layout.simple_list_item_multiple_choice,nome_numero);

                //Aggiorno la grafica
                ListView lv = (ListView)findViewById(R.id.ElencoNumeri);
               
                //Mostro i dati nella ListView
                lv.setAdapter(arrayAdapter);
                lv.setItemsCanFocus(false);
                lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
               
                //Aggiorno la lista
                arrayAdapter.notifyDataSetChanged();
               
            }
        }; //Chiudo l'handler
       
    }

il problema è che l'applicazione viene interrotta e dal logcat ho recuperato:

Codice: [Seleziona]
09-20 15:23:15.959: ERROR/AndroidRuntime(285): Uncaught handler: thread main exiting due to uncaught exception
09-20 15:23:15.969: ERROR/AndroidRuntime(285): java.lang.ClassCastException: android.widget.TextView
09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at com.italiandevteam.filtrosms.FiltroSMSActivity$2.handleMessage(FiltroSMSActivity.java:86)
09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at android.os.Looper.loop(Looper.java:123)
09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at android.app.ActivityThread.main(ActivityThread.java:4363)
09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at java.lang.reflect.Method.invokeNative(Native Method)
09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at java.lang.reflect.Method.invoke(Method.java:521)
09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at dalvik.system.NativeStart.main(Native Method)

Ma non riesco a trovare il problema...sapete aiutarmi?

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:Uncaught handler: thread main exiting due to uncaught exception
« Risposta #1 il: 20 Settembre 2011, 19:08:10 CEST »
0
Qua cosa c'è?

09-20 15:23:15.969: ERROR/AndroidRuntime(285):     at com.italiandevteam.filtrosms.FiltroSMSActivity$2.handleMessage(FiltroSMSActivity.java:86)
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store