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