2010-09-09 9 views
1

Je développe une application dans laquelle je reçois une exception, et je sais que celui-ci est l'erreur stupide ou petite que je fais, mais votre aide peut me surprendre et de faire ma journée:Android - Obtenir Exception

Dans le code ci-dessus, si je fais i = 0 ou i = 1 dans la fonction tryDemo alors il fonctionne avec succès, mais si je le fais autre que 0 ou 1 alors lève une exception comme "Demo - Demo Exception".

Je ne sais pas mais je pense que l'exception soulève de getApplicationContext().

Mise à jour: - 1

L'exception que je reçois, comme suit:

alt text

Mise à jour: - 2 Si je retire la partie "fil" et écrit le code de la fonction entière dans le bouton cliquez sur événement et remplacé le "getApplicationContext()" avec v.getContext() puis il fonctionne avec succès ......... mais je veux l'implémenter dans le fil.

S'il vous plaît aidez-moi et me surprendre ...

Thanx

+0

Dans votre capture, placez e.printStackTrace(). Cela vous donnera le numéro de ligne sur lequel l'erreur est. Cela vous donnera plus d'informations au moins. – skorulis

+0

Que diriez-vous de Log.i ("Demo", "Demo - Demo Exception", e); donc nous pouvons réellement voir quelle est l'exception et vous dire ce qui ne va pas? – EboMike

+0

@Skorulis @EboMike j'ai téléchargé l'image de "Log", s'il vous plaît vérifier et me donner des suggestions que vous pouvez ... merci pour le commentaire –

Répondre

1

Il suffit de lire vos journaux: havre de paix D Vous » t appelé Looper.prepare()

Si je ne me trompe pas, vous devez envelopper votre code AlertDialog avec Looper.prepare() et Looper.loop()

il ressemble à:

Looper.prepare() 
// AlertDialog code 
Looper.loop() 
+0

@KLordTwaroog J'ai enveloppé le code AlertDialog comme vous l'avez dit mais maintenant son exception de lancement: tag => AndroidRunTime, Message => android.view.WindowManager $ BadTokenException: Impossible d'ajouter une fenêtre ...... –

+0

J'utilise le contexte d'activité pour créer AlertDialogs dans mon code. Aussi, je ne suis pas sûr, si le AlertDialog ne devrait pas s'exécuter sur le thread de l'interface utilisateur. – LordTwaroog

1

Vous obtenez probablement un RuntimeException. J'ai essayé d'appeler une création de dialogue dans un thread ne pas le fil de l'interface utilisateur et a obtenu ceci:

09-09 00:46:37.702: ERROR/AndroidRuntime(763): Uncaught handler: thread Thread-10 exiting due to uncaught exception 
09-09 00:46:37.724: ERROR/AndroidRuntime(763): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
09-09 00:46:37.724: ERROR/AndroidRuntime(763):  at android.os.Handler.<init>(Handler.java:121) 
09-09 00:46:37.724: ERROR/AndroidRuntime(763):  at android.view.ViewRoot.<init>(ViewRoot.java:192) 
09-09 00:46:37.724: ERROR/AndroidRuntime(763):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
09-09 00:46:37.724: ERROR/AndroidRuntime(763):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
09-09 00:46:37.724: ERROR/AndroidRuntime(763):  at android.view.Window$LocalWindowManager.addView(Window.java:392) 
09-09 00:46:37.724: ERROR/AndroidRuntime(763):  at android.app.Dialog.show(Dialog.java:231) 
09-09 00:46:37.724: ERROR/AndroidRuntime(763):  at com.pkg.name.ToplistActivity$3.run(ToplistActivity.java:149) 

Solution est d'envelopper votre déclaration d'autre comme:

else { 
    runOnUiThread(new Runnable() { 
     public void run() { 
      ... 
     } 
    }); 
} 
+0

merci pour la réponse et laissez-moi l'essayer ..... –

+0

j'ai enveloppé autre comme vous l'avez dit, mais maintenant son lancement nouvelle erreur: tag => AndroidRunTime, Message d'erreur => android.view.WindowManager $ BadTokenException: Impossible d'ajouter fenêtre ...... –

+0

@Paresh Mayani: Difficile de savoir sans afficher le nouveau code et l'exception. Mettez à jour la question – Key

1

commentaires Commander dans ce post:

Using Application context everywhere?

Aussi, si vous remplacez getApplicationContext() avec actiivtyname.getApplicationContext() quelles sont les erreurs que vous obtenez?

1

Quelques petites erreurs avec ceci. Tout d'abord, vous ne devez JAMAIS toucher les éléments d'interface utilisateur d'un sujet que vous avez créé.

Vous aurez besoin pour Handlers fait connaissance d'fil: http://developer.android.com/reference/android/os/Handler.html

La façon dont ils travaillent est, vous les initialisez dans votre thread d'interface utilisateur normale. (le thread votre méthode onCreate() est appelée.) Les gestionnaires, sont des objets thread-safe que vous étendez pour communiquer entre les threads.

Ainsi, sur votre onCreate(): méthode

Handler pHandler = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
      Bundle bundle = msg.getData(); 
      int msg_type = bundle.getInt("TYPE"); 
      if (msg_type == MyThread.ERROR_MSG) 
      { 
       ///SOMETHING HAPPENED 
       return; 
      } 
      else 
      { 
       //background task finished ok 
      } 
     } 
    }; 

Puis, à partir de votre run() vous envoyer un message en utilisant un objet Bundle et le message. http://developer.android.com/reference/android/os/Bundle.html et http://developer.android.com/reference/android/os/Message.html

La façon dont je tiens à le faire, de garder les choses propres est d'étendre la classe Thread pour ajouter un peu de cohérence ...

class MyThead extends Thread 
{ 
    public final int ERROR_MSG = 0; 
    public final int OK_MSG = 1; 
    Handler mHandler; 

    MyThread(Handler pHandler) 
    { 
     mHandler = pHandler; 
    } 

    @Override 
    public void run() 
    { 
     //send a message back to the ui thread.... 
     Message msg = new Message(); 
     Bundle bundle = new Bundle(); 
     bundle.putInt("TYPE", OK_MSG); 
     msg.setData(bundle); 
     mHandler.sendMessage(msg); 
    } 
} 

si vous voulez obtenir un peu fantaisie, vous séparez complètement le code de l'interface utilisateur et le code du thread de travail. Si votre tâche d'arrière-plan ne sera pas longue, vous pouvez exécuter runonUiThread() comme décrit précédemment.

Vous pouvez également utiliser AsyncTask, voir: http://developer.android.com/reference/android/os/AsyncTask.html

Voici un exemple de leur page, son utilisation est assez simple:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

Finalement, cependant, ces approches ne sont pas parfaits si la l'utilisateur change d'orientation lorsque votre tâche est en cours d'exécution. (ou si votre activité est supprimée pour toute autre raison.) Dans ce cas, vous devez configurer un service: http://developer.android.com/reference/android/app/Service.html

Questions connexes