Android音乐App开发准备( 简易音乐 二 )

Android音乐App开发准备( 简易音乐 二 )

关于

  第一篇看Android音乐App开发准备( 简易音乐 一 )在写第二篇之前,我遇到了一个bug(死活不进启动页面),几乎没有任何提示。后面经过调试发现原来是在子线程里面忘记添加了mCountDownLatch.countDown();,导致线程一直被阻塞

 ExecutorService pool = Executors.newFixedThreadPool(CORE_POOL_SIZE);
        pool.submit(new Runnable() {
   
   
            @Override
            public void run() {
   
   
                //吐司初始化
               // ToastUtils.init(instance,new ToastQQStyle(instance));
               // mCountDownLatch.countDown();

            }
        });

        pool.submit(new Runnable() {
   
   
            @Override
            public void run() {
   
   
               
               

            }
        });
        try {
   
   
         
            //如果await之前没有调用countDown那么就会一直阻塞在这里
            mCountDownLatch.await();
        }catch (InterruptedException e){
   
   
            e.printStackTrace();
        }

  后面我把注释解开之后,使用了权限申请拒绝之后奔溃了:

  PermissionX.init(this)
                .permissions(ARR_NEED_PERMISSIONS)
                .request((allGranted, grantedList, deniedList) -> {
   
   
                    if (allGranted){
   
   
                        //开始倒计时
                        startCountDown();
                    }else {
   
   
                        ToastUtils.show("缺少如下权限"+deniedList);
                    }
                });

  原因是ToastUtils未初始化,原来是因为我在子线程里面初始化了Toast,可是我是想着优化冷启动的,但是可不想生成bug,后面百度一番,学习了一波,知道了IdleHandler,修改代码如下:

Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
   
   
           @Override
           public boolean queueIdle() {
   
   
               //空闲时初始化
                ToastUtils.init(instance,new ToastQQStyle(instance));
               return false;
           }
       });

  问题解决,冷启动速度依然优化成功。
补充:
  在后面我又发现程序运行奔溃了,还是提示的toast未初始化,毕竟我之前的IdleHandler只是在空闲的时候初始化,如果程序第一次打开没问题,可是后面拒绝权限申请后再次打开,涉及到其他初始化使用到了message导致暂时不空闲也就未初始化了,所以暂时先放到oncreate里面去初始化。

效果:

在这里插入图片描述

编写Activity基类-BaseActivity

  编写view层基类:

public interface BaseView {
   
   
}

  编写Model层基类:

public interface BaseModel {
   
   
}

  编写控制层基类:

public class BasePresenter<V extends BaseView, M extends BaseModel> {
   
   

    protected V mView;
    protected M mModel;


    public void unSubscribe(){
   
   
        if(mView != null){
   
   
            mView = null;
        }
    }
}

  编写基类BaseActivity,其中的StatusBarUtil工具类使用教程参考android实现沉浸式状态栏

/**
 * Activity基类
 */
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity {
   
   
    protected Unbinder unbinder;
    protected P mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        if (onCreatePresenter() != null) {
   
   
            mPresenter = onCreatePresenter();
        }


    }

    @Override
    public void setContentView(int layoutResID) {
   
   
        super.setContentView(layoutResID);
        injectView();
        initModule();
        initData();
    }

    private void injectView() {
   
   
        unbinder = ButterKnife.bind(this);
        StatusBarUtil.setColor(this,getResources().getColor(R.color.colorAccent),0);

    }
    @Override
    protected void onResume() {
   
   
        super.onResume();

    }
    public void setBackBtn() {
   
   
        ImageView backBtn = findViewById(R.id.iv_back);
        backBtn.setVisibility(View.VISIBLE);
      /*  VectorDrawableCompat vectorDrawableCompat = VectorDrawableCompat.create(getResources(), R.drawable.shape_back, getTheme());
        //你需要改变的颜色
        vectorDrawableCompat.setTint(Color.parseColor(color));*/
     //  backBtn.setImageDrawable(vectorDrawableCompat);
        backBtn.setOnClickListener(v -> {
   
   
            System.gc();
            onBackPressed();
        });
    }

    protected abstract P onCreatePresenter();
    protected abstract void initData();
    protected abstract void initModule();
    @Override
    protected void onPause() {
   
   
        super.onPause();

    }
    @Override
    protected void onDestroy() {
   
   
        System.gc();
        if (mPresenter != null) {
   
   
            mPresenter = null;
        }
        super.onDestroy();



    }

    /**
     * 页面跳转
     *
     * @param cls
     */
    public void  startActivity(Class<?> cls){
   
   
          startActivity(cls,null);
    }

    /**
     * 携带数据的页面跳转
     *
     * @param cls
     * @param bundle
     */
    public void startActivity(Class<?> cls,Bundle bundle){
   
   
        Intent intent = new 
### 鸿蒙系统音乐应用程序开发教程 鸿蒙系统的音乐应用程序开发流程与其他应用开发类似,主要包括需求分析、环境搭建、设计、编码、测试、发布和维护等阶段[^1]。以下是关于音乐应用程序开发的具体内容: #### 1. 环境搭建 在开发鸿蒙音乐应用程序之前,需要安装并配置开发工具 DevEco Studio 和鸿蒙 SDK。通过 DevEco Studio,开发者可以高效地构建分布式应用,并充分利用鸿蒙系统的特性,如多设备协同和分布式数据管理。确保参考官方文档和示例代码,以保证应用的兼容性和性能[^1]。 #### 2. 目录结构说明 在鸿蒙音乐应用项目中,常见的目录结构如下: - **AppScope**: 全局资源共享目录,用于存放公共资源文件。 - **entry**: 源代码存放的地方,包含应用的主要逻辑。 - **hvigor**: 储存前端构建配置文件信息,基于 TypeScript 的前端构建和任务编排。 - **oh_modules**: 存放所有项目用到的第三方包。 - **.gitignore**: 代码版本管理文件夹,用于指定忽略的文件或文件夹。 - **build-profile.json5**: 配置或修改模块名称。 - **.ts**: 执行编译和构建任务的脚本文件。 - **hvigorw.bat**: Windows 操作系统下执行的脚本。 - **bvigorw**: Linux 或 Unix 操作系统中用于 ohpm 的编译管理。 - **.properties**: 配置文件的属性。 - **oh-package.json5**: 包含依赖配置、项目配置以及第三方包依赖关系。 - **oh-package-lock.json5**: 树型依赖结构,包含详细的项目配置信息[^2]。 #### 3. 音乐播放功能实现 音乐播放功能是音乐应用程序的核心部分,可以通过以下步骤实现: - **音频播放接口**: 使用鸿蒙提供的媒体播放 API,例如 `MediaPlayback` 类。 - **音频资源管理**: 将音乐文件存储在 `AppScope` 或远程服务器中,并通过 URI 访问。 - **播放控制**: 实现播放、暂停、停止、上一首、下一首等功能。 以下是一个简单的音乐播放代码示例,使用鸿蒙的 `MediaPlayback` 接口: ```python import media from ohos.media import MediaPlayer def play_music(uri): player = MediaPlayer() player.setSource(uri) # 设置音频资源路径 player.prepare() # 准备播放 player.start() # 开始播放 def pause_music(player): if player.isPlaying(): player.pause() # 暂停播放 def stop_music(player): if player.isPlaying(): player.stop() # 停止播放 ``` #### 4. 用户界面设计 用户界面的设计应注重用户体验,包括音乐列表展示、播放控件(播放、暂停、进度条等)以及设备适配。可以使用鸿蒙的 UI 组件库进行开发,例如 `ListContainer` 和 `Button`[^1]。 #### 5. 测试与发布 在开发完成后,需要对音乐应用程序进行全面测试,包括功能测试、性能测试和兼容性测试。测试通过后,可以将应用发布到华为应用市场或其他分发渠道。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪の星空朝酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值