0

こんにちは、トースト メッセージを表示するのに問題があります。実際には、間違ったスレッドでトーストを表示しようとしているなどの理由でプログラムがクラッシュします。

このトピックに関する他の質問をいくつか読んでいますが、ソウルションはハンドラーを使用して UI と通信するようなものだと思いますが、その方法がわかりません。コードのどの部分からメッセージをトーストしますか?

たとえば、私は次のようなことを試みています: [問題のある行は ** ** の間にあります]

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;
                                }
                        }
                }
        };
}

お時間をいただきありがとうございました

4

3 に答える 3

2

ウィジェットにアクセスする場合は、メイン スレッドにある必要があります。アクティビティにいる場合は、次のように記述できます。

runOnUiThread(new Runnable(){
    public void run(){
        //toast
    }
});
于 2013-02-01T15:59:50.643 に答える
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();
    }
}
于 2013-02-01T16:13:32.253 に答える
1

バックグラウンド スレッドから Toast を次のように表示するには、 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();
    }
});
.....

}
于 2013-02-01T15:56:45.057 に答える