Activity.runOnUiThread 和 View.post()的讲解

本文介绍了一个简单的Android应用程序示例,该程序通过网络下载图片并显示在ImageView中。使用了多线程技术来处理网络请求,避免阻塞UI线程,并通过runOnUiThread或view.post方法更新UI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class MainActivity extends Activity {

Button button;
ImageView imageView;
Context context;
Runnable runnable;
Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    context=this;

    //初始化控件
    init();

    //控件点击事件
    weightOnClick();
}

private void init(){
    button= (Button) findViewById(R.id.bt_download);
    imageView= (ImageView) findViewById(R.id.image);

    runnable=new Runnable() {
        @Override
        public void run() {
            if (bitmap!=null){
                imageView.setImageBitmap(bitmap);
            }
        }
    };
}

private void weightOnClick(){
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpURLConnection httpURLConnection=null;
                    InputStream inputStream=null;
                    try {
                        URL url=new URL("http://c.hiphotos.baidu.com/image/pic/item
                        /c8ea15ce36d3d53984cf1e113e87e950342ab075.jpg");

                        httpURLConnection= (HttpURLConnection) url.openConnection();
                         inputStream=httpURLConnection.getInputStream();
                        bitmap= BitmapFactory.decodeStream(inputStream);
                       // ((Activity)context).runOnUiThread(runnable);
                        imageView.post(runnable);
                        inputStream.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }finally {
                        httpURLConnection.disconnect();
                    }
                }
            }).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、付费专栏及课程。

余额充值