您的位置:首页 > 移动开发 > Android开发

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

2016-09-09 10:41 134 查看
registerReceiver 和 unregisterReceiver 要同一个 mReceiver对象才行,否则会出现”Caused by: java.lang.IllegalArgumentException: Receiver not registered”错误。但是!即便是同一个 mReceiver也极容易犯这个错误,原因是mReceiver被多次unregisterReceiver,导致这个错误。解决办法,设置一个全局变量标记mReceiver是否被register过。

在SplashActivity或者LoginActivity跳转到MainActivity之间,由于MainActivity是由一个ViewPager加载5个Fragment,每个Fragment加载了大量数据,因此整个MainActivity耗时过长,导致中间会有明显的停顿,即SplashActivity或者LoginActivity好像在那里卡住了,对于用户来说,感觉像app没有相应了一样。所以,尽量在被跳转的Activity中少做耗时操作。

对静态成员变量初始化了,如下图,若后面改变了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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: