Activity.runOnUiThread(Runnable)简单介绍

本文介绍了一种在Android应用中更新UI的方法:使用Activity.runOnUiThread(Runnable)。通过将更新UI的代码封装进Runnable对象,并在需要时传递给runOnUiThread()方法,可以确保在非UI线程进行耗时操作的同时,安全地更新UI。

利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程。

public class TestActivity extends Activity {
    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handler_msg);
        btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // 模拟耗时的操作。
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        // 更新主线程UI
                        TestActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                btn.setText("更新完毕!");
                            }
                        });
                    }
                }).start();
            }
        });
    }
}


``` package com.example.mp3; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.Build; import android.os.IBinder; import android.util.Log; import androidx.core.app.NotificationCompat; public class MusicService extends Service { private MediaPlayer mediaPlayer; private static final String CHANNEL_ID = "MusicServiceChannel"; runOnUiThread(new Runnable() { public void run() { showNotification("Music Playing"); } }); @Override public void onCreate() { super.onCreate(); mediaPlayer = MediaPlayer.create(this,R.raw.music1); if(mediaPlayer == null){ Log.e("MusicService","Failed to load mp3 file"); }else{ mediaPlayer.setLooping(false); } createNotificationChannel(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { String action = intent.getAction(); if (action != null) { switch (action) { case "开始播放": startPlayback(); break; case "停止播放": stopPlayback(); break; } } return START_NOT_STICKY; } private void startPlayback() { new Thread(() -> { if (mediaPlayer == null) { mediaPlayer = MediaPlayer.create(this, R.raw.music1); mediaPlayer.setLooping(false); } if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); Activity.runOnUiThread(() -> showNotification("Music Playing")); } }).start(); } private void stopPlayback() { new Thread(() -> { if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } mediaPlayer.reset(); mediaPlayer.release(); mediaPlayer = null; } Activity.runOnUiThread(() -> showNotification("Music Stopped")); }).start(); } @SuppressLint("ForegroundServiceType") private void showNotification(String status) { Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("Music Player") .setContentText(status) .setSmallIcon(R.drawable.musicphoto) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .build(); startForeground(1, notification); } private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel( CHANNEL_ID, "Music Service Channel", NotificationManager.IMPORTANCE_DEFAULT ); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } @Override public void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { mediaPlayer.release(); mediaPlayer = null; } } @Override public IBinder onBind(Intent intent) { return null; } }```runOnUiThread报错
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值