0

嗨,我在显示 toast 消息时遇到了一些问题,实际上程序崩溃说我试图在错误的线程中显示 toast 或类似的东西。

我一直在阅读有关该主题的其他一些问题,我认为灵魂类似于使用处理程序与 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

使用Activity.runOnUiThread将后台线程中的 Toast 显示为:

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 回答
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 回答