2013-02-01 41 views
0

嗨我有一些問題,以顯示吐司消息,實際上是程序崩潰說,我想顯示吐司在錯誤的線程或類似的東西。由於Android吐司消息在錯誤的線程中啓動的錯誤

我一直在閱讀有關該主題的一些其他問題,我認爲soultions是像使用的處理程序與UI到comunicate,但不知道怎麼辦呢,能和我的例子/教程的任何一個份額如何從代碼的任何部分啓動敬酒信息?

比如我想是這樣的:有問題的線**之間]

public class SamplesTiming extends Activity { 
     ... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_samples_timing); 
     ... 

    } 

     private void setButtonHandlers() { 
       ((Button)findViewById(R.id.btnStart)).setOnClickListener(btnClick); 
     ((Button)findViewById(R.id.btnStop)).setOnClickListener(btnClick); 
     } 

     private void enableButton(int id,boolean isEnable){ 
       ((Button)findViewById(id)).setEnabled(isEnable); 
     } 

     private void enableButtons(boolean isRecording) { 
       enableButton(R.id.btnStart,!isRecording); 
       enableButton(R.id.btnStop,isRecording); 
     } 



     private void startRecording(){ 

           ... 

       recordingThread = new Thread(new Runnable() { 

         //@Override 
         public void run() { 

           writeAudioDataToFile(); 
         } 
       },"AudioRecorder Thread"); 

       recordingThread.start(); 
     } 


     private void writeAudioDataToFile(){ 

       ... 

       while(isRecording){ 

          ... 

         read = recorder.read(data, 0, bufferSize); 


         if(condition) **Toast.makeText(getApplicationContext(), 
          "it happen", Toast.LENGTH_LONG).show();** 

          ... 

         }      


     } 

     private void stopRecording(){ 
       if(null != recorder){ 
         isRecording = false; 

         recorder.stop(); 
         recorder.release(); 

         recorder = null; 
         recordingThread = null; 
       }     

     } 


     private View.OnClickListener btnClick = new View.OnClickListener() { 
       // @Override 
       public void onClick(View v) { 
         switch(v.getId()){ 
           case R.id.btnStart:{ 



            enableButtons(true); 
             startRecording(); 

             break; 
           } 
           case R.id.btnStop:{ 


             enableButtons(false); 
             stopRecording(); 

             break; 
           } 
         } 
       } 
     }; 
} 

非常感謝您的寶貴時間

+0

「或類似的東西」是一個非常特殊的例外,你會通過簡單的google搜索找到解決方案「類似的事情」(第一個答案) – njzk2

+0

如果你是一個真正有用的成員,希望你贏得獎勵給這裏最好笑的成員。祝你好運;) –

+0

只是想指出你的問題沒有包含很多信息來幫助解決問題。還試圖說,我不明白爲什麼你會問「這樣的事情」,而不是發佈完整的錯誤。 – njzk2

回答

1

使用Activity.runOnUiThread用於顯示從背景吐司線程如下:

while(isRecording){ 

...... 

SamplesTiming.this.runOnUiThread(new Runnable() { 
    public void run() { 
     // show toast here 
     Toast.makeText(SamplesTiming.this, 
      "it happen", Toast.LENGTH_LONG).show(); 
    } 
}); 
..... 

} 
+0

非常感謝你!正是我正在尋找的 –

+0

@ user1773841:最受歡迎的朋友 –

2

它必須在主線程中,如果你想訪問小部件。 如果您處於活動狀態,則您可以撰寫以下內容。

runOnUiThread(new Runnable(){ 
    public void run(){ 
     //toast 
    } 
}); 
+0

非常感謝您的回覆! –

1

如果你和我一樣,你不喜歡方便的方法,使用Handler

public class MainActivity extends Activity { 
    private Handler mHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mHandler = new Handler(); 

     doSomethingOnAnotherThread(); 
    } 

    private void doSomethingOnAnotherThread() { 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       mHandler.post(new Runnable() { 

        @Override 
        public void run() { 
         Toast.makeText(MainActivity.this, "toast skagen", Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      } 
     }).start(); 
    } 
} 
+0

非常感謝!我真的需要學習如何使用處理程序,因爲我仍然遇到嚴重的問題以使其工作。 –