2014-03-12 116 views
0

我想在我的線程中使用處理程序,但會產生錯誤。這是我的代碼,函數的一部分,我有問題,其中控制是一個布爾和一個線程。線程中使用處理程序

private void mainbucle() { 

     bucle = new Thread(new Runnable() { 
      @Override 
      public void run() { 

       while (control == true) { 


        Handler handler2 = new Handler(); 
        handler2.postDelayed(new Runnable() { 
         public void run() { 

               //MY ACTIONS// 

         } 
        }, 1000); 

       } 
      } 
     }, "bucle telo"); 
     bucle.start(); 
    } 

而且這個logcat的:

03-12 13:22:44.321: E/AndroidRuntime(18987): FATAL EXCEPTION: bucle telo 
03-12 13:22:44.321: E/AndroidRuntime(18987): Process: com.example.uwbprototipe, PID: 18987 
03-12 13:22:44.321: E/AndroidRuntime(18987): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
03-12 13:22:44.321: E/AndroidRuntime(18987): at android.os.Handler.<init>(Handler.java:200) 
03-12 13:22:44.321: E/AndroidRuntime(18987): at android.os.Handler.<init>(Handler.java:114) 
03-12 13:22:44.321: E/AndroidRuntime(18987): at com.example.uwbprototipe.MainActivity$4.run(MainActivity.java:224) 
03-12 13:22:44.321: E/AndroidRuntime(18987): at java.lang.Thread.run(Thread.java:841) 
03-12 13:22:44.911: E/ActivityThread(18987): Activity com.example.uwbprototipe.MainActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
03-12 13:22:44.911: E/ActivityThread(18987): android.app.IntentReceiverLeaked: Activity com.example.uwbprototipe.MainActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:805) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:606) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1430) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1410) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1404) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:467) 
03-12 13:22:44.911: E/ActivityThread(18987): at com.example.uwbprototipe.MainActivity.onCreate(MainActivity.java:71) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.Activity.performCreate(Activity.java:5231) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.ActivityThread.access$800(ActivityThread.java:135) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.os.Handler.dispatchMessage(Handler.java:102) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.os.Looper.loop(Looper.java:136) 
03-12 13:22:44.911: E/ActivityThread(18987): at android.app.ActivityThread.main(ActivityThread.java:5017) 
03-12 13:22:44.911: E/ActivityThread(18987): at java.lang.reflect.Method.invokeNative(Native Method) 
03-12 13:22:44.911: E/ActivityThread(18987): at java.lang.reflect.Method.invoke(Method.java:515) 
03-12 13:22:44.911: E/ActivityThread(18987): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
03-12 13:22:44.911: E/ActivityThread(18987): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
03-12 13:22:44.911: E/ActivityThread(18987): at dalvik.system.NativeStart.main(Native Method) 

在哪裏,如何使用循環指令?

感謝

UPDATE

隨着答案我是誰,我解決了控制bucle的問題,但現在沒有按鈕是responds..this其監聽器的代碼:

private View.OnClickListener btnClick = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      switch (v.getId()) { 
      case R.id.btnStart: { 
       control = true; 
       enableButtons(true); 
       mainbucle(); 
       break; 
      } 
      case R.id.btnStop: { 
       control = false; 
       enableButtons(false); 
       bucle = null; 
       break; 
      } 
      } 
     } 

    }; 
+0

請澄清你的問題。 Btw將'control == true'拋出一個編譯錯誤,因爲控件沒有被定義。 –

+0

什麼是錯誤? –

+0

發佈'LogCat'。 –

回答

1

你必須在新線程外附加處理程序,然後在線程內使用它:

private void newThread() { 

    Handler h = new Handler(); 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //... 
      h.postDelayed(new Runnable() { 
        public void run() { 
         //... 
        } 
       }, 1000); 

     } 
    }); 
    t.start(); 
} 

當您發佈的處理程序,您的代碼將在哪個線程運行的處理程序連接到它
(你必須重視主線程中處理程序,以避免錯誤)

編輯: this may help you

+0

運行良好,但現在的問題是,onclicklistener聽按鈕將控制爲false並停止bucle不起作用。所以永遠不要停止 – user3243651

+0

你可以發佈你的真實代碼嗎? –

+0

真的你想要做什麼? –