2014-05-04 1 views
1

im envoyer un message à thread principal de l'interface utilisateur par thread de travail mais il donne ces erreursim envoi msg Retour à thread d'interface utilisateur, mais pas

05-04 11:59:00.889: E/AndroidRuntime(1156): FATAL EXCEPTION: main 
05-04 11:59:00.889: E/AndroidRuntime(1156): Process: com.example.threadproject, PID: 1156 
05-04 11:59:00.889: E/AndroidRuntime(1156): java.lang.NullPointerException 
05-04 11:59:00.889: E/AndroidRuntime(1156):  at com.example.threadproject.MyThread.PostMsg(MyThread.java:113) 
05-04 11:59:00.889: E/AndroidRuntime(1156):  at com.example.threadproject.MyThread.dials(MyThread.java:64) 
05-04 11:59:00.889: E/AndroidRuntime(1156):  at com.example.threadproject.MainThread.Function(MainThread.java:39) 
05-04 11:59:00.889: E/AndroidRuntime(1156):  at com.example.threadproject.MainThread.access$0(MainThread.java:35) 
05-04 11:59:00.889: E/AndroidRuntime(1156):  at com.example.threadproject.MainThread$1.onClick(MainThread.java:28) 
05-04 11:59:00.889: E/AndroidRuntime(1156):  at android.view.View.performClick(View.java:4438) 
05-04 11:59:00.889: E/AndroidRuntime(1156):  at android.view.View$PerformClick.run(View.java:18422) 

le code est

public class MyThread extends Thread 
{ 

    Handler mHandler ; 
    Handler mHandlerMain = new Handler(Looper.getMainLooper()); 



    public void run() 
     { 
      Looper.prepare(); 
      PostMainThreadMsg();      
      mHandler = new Handler() 
      { 
       public void handleMessage(Message msg) 
       { 
        Log.i("Message", "" + msg); 
        //PostMainThreadMsg();    
       } 
      }; 

      Looper.loop(); 

     } 


    /////////////////////////////////////////////////////////////////////////////////////////////////////// 


     public class Dial implements Runnable 
     { 
      int m_nLine; 


      public int m_bResult; 

      public void run() 
      { 
       Log.v("dial","class run"); 

       m_nLine++; 

       RunnableNotify(this); 
      } 
     } 


     public int dials(int nLine) 
     { 
      startThread(); 

      Dial m_objDial = new Dial(); 

      m_objDial.m_nLine = nLine; 


      PostMsg(m_objDial); 

      return m_objDial.m_bResult ; 

     } 

    public void PostMainThreadMsg() 
    { 
//  mHandlerMain .post(new Runnable() { 
//   
//   @Override 
//   public void run() { 
//    // TODO Auto-generated method stub 
//    Message msg = Message.obtain(); 
//    msg.arg1 = 5; 
//    mHandlerMain.sendMessage(msg); 
//    
//   } 
//  }); super.start(); 

     Runnable n_obj = new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       Message msg = Message.obtain(); 
       msg.arg1 = 20; 
       mHandlerMain.sendMessage(msg); 



      } 
     }; 
     PostMssg(n_obj); 


    } 

    ////////////////////////////////////////////////////////////////////////////////////////////////////// 


     public void PostMssg(Runnable runnable) 
     { 
      mHandlerMain.post(runnable); 

     } 

     public void PostMsg(Runnable runnable) 
     { 
      mHandler.post(runnable); 

      RunnableWait(runnable); 


     } 

     public void startThread() 
     { 

      super.start(); 

     } 
+0

qui est la ligne 113 dans MyThread? – user2450263

Répondre

0

En Dials vous démarrez le thread, puis appelez PostMsg qui utilise mHandler. Mais mHandler n'est initialisé que dans le thread (dans votre première méthode run).

Donc il y a une course; il n'y a aucune garantie que l'initialisation aura eu lieu avant l'utilisation. (Et dans tous les cas si vous affectez à une variable dans un thread, le résultat peut ne pas être visible dans l'autre thread.)

Ce n'est pas difficile à diagnostiquer - vous connaissez mHandler est null, vous avez juste besoin de travailler pour voir où il devrait être initialisé, puis voir s'il y a un moyen pour que l'initialisation ne se soit pas encore produite.

0

Si j'étais vous, j'utiliserais AsyncTask.
La gestion du processus est également facilitée.
Des questions, s'il vous plaît n'hésitez pas à commenter :)

Questions connexes