Android 在不同于MainActivity的类中显示来自线程的toast消息

Android 在不同于MainActivity的类中显示来自线程的toast消息,android,multithreading,android-toast,Android,Multithreading,Android Toast,我刚刚开始学习Android,并尝试编写一个简单的应用程序。点击按钮后,MP开始播放 下面的代码工作正常 但我不知道如何显示祝酒词 当媒体播放器中出现异常时,请尝试catch语句 我想把播放器线程放在单独的类中,以便进一步实验 public class MainActivity extends Activity { static String url="http://stream001.radio.hu:8080/mr3.mp3"; static Activity context; @O

我刚刚开始学习Android,并尝试编写一个简单的应用程序。点击按钮后,MP开始播放

下面的代码工作正常 但我不知道如何显示祝酒词 当媒体播放器中出现异常时,请尝试catch语句

我想把播放器线程放在单独的类中,以便进一步实验

public class MainActivity extends Activity {
static String url="http://stream001.radio.hu:8080/mr3.mp3";
static Activity context;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
        context=this;
        //set button listener
        Button btn=(Button) findViewById(R.id.button1);
        btn.setOnClickListener(
            new OnClickListener(){
                public void onClick(View v){
                    myMediaPlayerClass.startMediaPlayer(url, context);
                }
            }
        );
    }
  ...   
}


public class myMediaPlayerClass {
    static MediaPlayer mp=new MediaPlayer();

    public static void startMediaPlayer(  final String myUrl, final Activity myContext){

        new Thread(new Runnable(){

            public void run(){
            string url=myUrl;
                Context context=myContext;
            //***********************************************
            // trying to Toast from here results in crash
        //Toast.makeText(context, "Thread running", Toast.LENGTH_LONG).show();
                //*********************************************************************
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

            try {mp.setDataSource(url);} 
            catch (IllegalArgumentException e) {}
            catch (SecurityException e) {} 
            catch (IllegalStateException e) {} 
            catch (IOException e) {}

            mp.setOnPreparedListener(new OnPreparedListener() {
            @Override
                public void onPrepared(MediaPlayer paramMediaPlayer){}
                    });

            mp.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
                @Override
                public void onBufferingUpdate(MediaPlayer mp, int percent) {}
                });

        try {mp.prepare();} 
        catch (IllegalStateException e) {} 
        catch (IOException e) {}

        mp.setVolume(1, 1);
        mp.start();
            }   
    }).start();

    }
 }

不能直接从非UI线程显示祝酒词。是的,您可以这样做,但需要实现
runOnUiThread

runOnUiThread(new Runnable() {
                            public void run() {
                                Toast.makeText(getApplicationContext(), "Your message", Toast.LENGTH_LONG).show();
                                }
                            });
在不同的线程上显示Toast消息…

在run()方法中使用它


不能从非UI线程显示祝酒词。使用Use getApplicationContext()而不是上下文
Toast.makeText(getApplicationContext(),"toast msg here",Toast.LENGTH_SHORT).show();