Android 开发过程中碰到的小坑集合

  1. registerReceiver 和 unregisterReceiver 要同一个 mReceiver对象才行,否则会出现”Caused by: java.lang.IllegalArgumentException: Receiver not registered”错误。但是!即便是同一个 mReceiver也极容易犯这个错误,原因是mReceiver被多次unregisterReceiver,导致这个错误。解决办法,设置一个全局变量标记mReceiver是否被register过。
  2. 在SplashActivity或者LoginActivity跳转到MainActivity之间,由于MainActivity是由一个ViewPager加载5个Fragment,每个Fragment加载了大量数据,因此整个MainActivity耗时过长,导致中间会有明显的停顿,即SplashActivity或者LoginActivity好像在那里卡住了,对于用户来说,感觉像app没有相应了一样。所以,尽量在被跳转的Activity中少做耗时操作。
  3. 对静态成员变量初始化了,如下图,若后面改变了Config.TEMP_UNIT,那么MIN_YAXIS_TEMP是不会跟着变的,需要重新赋值一次。
public static float MIN_YAXIS_TEMP = getTemp(32);

public static float getTemp(float temp){
         if(Config.TEMP_UNIT.equals("ºC"))
            return temp;
         else
             return (float) (1.8 * temp + 32);
    }

4.. 当在Activity中覆盖了 onCreateOptionsMenu 和 onOptionsItemSelected 方法,你会发现 对于此Activity 来说,getSupportActionBar().setDisplayHomeAsUpEnabled(true); 和在 Manifest.xml 中设置如下时,返回键点击无反应!

<activity android:name=".MainActivity"
            android:parentActivityName=".ChooseHardwareActivity"/>

解决办法如下:

// 返回键的 id 为 android.R.id.home
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }

        return true;
    }

5.. 最好使用AppCompatActivity,不要使用Activity,否则后期定制会出现各种各样的麻烦坑。
6.. 用soundPool来播放音乐时,load不能太大的音频文件,否则加载会失败。其二是播放应该在load成功的回调了,而不是load后接着执行。

soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
            int loadId = soundPool.load(this.activity, R.raw.alarm, 1);
            AppLog.i("loadId = " + loadId);
            // id, 左声道音量, 右声道音量, 优先级, 是否循环(0: 不循环, -1: 循环), 播放比率
            soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
                @Override
                public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                    AppLog.i("onLoadComplete sampleId = " + sampleId + ", status = " + status);
                    int streamId = soundPool.play(sampleId, 1, 1, 0, -1, 1);
                    alarming = true;

                    if(ALARM_COUNT == 3){
                        ALARM_COUNT = 1;
                    }else if(ALARM_COUNT == 1){
                        ALARM_DURATION = ALARM_ONE_MIN;
                        ALARM_COUNT ++;
                        stopAlarm(streamId);
                    }else if(ALARM_COUNT == 2){
                        ALARM_DURATION = 3 * ALARM_ONE_MIN;
                        ALARM_COUNT ++;
                        stopAlarm(streamId);
                    }

                    showAlarmDialog(streamId);
                }
            });


private void stopAlarm(final int streamId){
        activity.mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                soundPool.stop(streamId);
                alarming = false;
            }
        }, ALARM_DURATION);
    }

    private void showAlarmDialog(final int streamId){
        AlertDialog.Builder builder = new AlertDialog.Builder(this.activity);
        builder.setTitle(BleApplication.getInstance().getResources().getString(R.string.alarm));
        builder.setMessage(BleApplication.getInstance().getResources().getString(R.string.temp_exceed_threshold));
        builder.setPositiveButton(BleApplication.getInstance().getResources().getString(R.string.ok), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                if(alarming) soundPool.stop(streamId);
            }});
        builder.create().show();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值