Android手机应用开发(九) | RxJava(RxAndroid)的简单使用

实验目的学会使用MediaPlayer学习RxJava,使用RxJava更新UI学会使用Service进行后台工作学会使用Service与Activity进行通信效果RxJava简介GitHub地址:ReactiveX团队RxJavaRxAndroidRxJava是主体,其实还有RxAndroid、RxGo、RxPY、RxSwift等适配这里使用的是RxAndro...
摘要由CSDN通过智能技术生成

实验目的

  1. 学会使用MediaPlayer
  2. 学习RxJava,使用RxJava更新UI
  3. 学会使用Service进行后台工作
  4. 学会使用Service与Activity进行通信

效果

gif5新文件

RxJava简介

GitHub地址:

ReactiveX团队

RxJava

RxAndroid

RxJava是主体,其实还有RxAndroidRxGoRxPYRxSwift等适配

这里使用的是RxAndroidRxJava

RxAndroid并不包括全部的RxJava,而是侧重Android的特性进行添加,所以防止缺少依赖库,还是都得使用

其它代码环境

这里使用的是 Android手机应用开发(八) | 制作简单音乐播放 的大部分代码

只是将更新UI的操作从Handler更改为RxJava

注册服务AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="wang.janking.mymusic">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
    ...
        <service
            android:name=".MusicService"
            android:exported="true" />
    ...
    </application>

</manifest>

新建服务MusicService.java

package wang.janking.mymusic;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.Environment;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;

import java.io.IOException;

public class MusicService extends Service {
   
    public final IBinder binder = new MyBinder();
    private MediaPlayer mp =  new MediaPlayer();
    private int isFinish = -1;
    private final int PLAY_CODE = 1, STOP_CODE = 2, SEEK_CODE = 3, NEWMUSIC_CODE = 4, CURRENTDURATION_CODE = 5, TOTALDURATION = 6;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
   
        try {
   
            mp.setDataSource(Environment.getExternalStorageDirectory() + "/data/山高水长.mp3");
            mp.prepare();
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
   
                @Override
                public void onCompletion(MediaPlayer mp) {
   
                    isFinish = 1;
                }
            });
        } catch (IOException e) {
   
            Log.e("prepare error", "getService: " + e.toString());
        }
        return binder;
    }


    public class MyBinder extends Binder {
   
        @Override
        protected boolean onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags) throws RemoteException {
   
            switch (code) {
   
                //service solve
                case PLAY_CODE:
                    play_pause();
                    break;
                case STOP_CODE:
                    stop();
                    break;
                case SEEK_CODE:
                    mp.seekTo(data.readInt());
                    break;
                case NEWMUSIC_CODE:
                    newMusic(Uri.parse(data.readString()));
                    reply.writeInt(mp.getDuration());
                case TOTALDURATION:
                    reply.writeInt(mp.getDuration());
                    break;
                case CURRENTDURATION_CODE:
                    reply.writeInt(mp.getCurrentPosition());
                    reply.writeInt(isFinish);
                    break;
            }
            return super.onTransact(code, data, reply, flags);
        }
    }
    public void play_pause() {
   
        if (mp.isPlaying()) {
   
            mp.pause();
        } else {
   
            mp.start();
            isFinish = -1;
        }
    }
    public void stop() {
   
        if (mp != null) {
   
            mp.stop();
            try {
   
                mp.prepare();
                mp.seekTo(0);
            } catch (Exception e) {
   
                Log.d("stop", "stop: " + e.toString());
            }
        }
    }
    public void newMusic(Uri uri){
   
            try{
   
                mp.reset();
                mp.setDataSource(this, uri);
                mp.prepare();
            }
       catch (Exception e){
   
            Log.d("New Music", "new music: " + e.toString());
        }
    }
    @Override
    public void onDestroy() {
   
        super.onDestroy();
        if(mp!= null){
   
            mp.reset();
            mp.release();
        }
    }

}

布局文件 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值