当前位置: 编程技术>移动开发
本页文章导读:
▪Concurrent并发库常见有关问题总结 Concurrent并发库常见问题总结
对于Android开发者来说掌握Java的concurrent并发库十分重要,本次Android123就并发库的一些常见问题做总结: 1. 原子操作 如果你过去开发过Win32驱动可能发现很多N.........
▪ 解决EditText在光标位置安插字符串,光标不会往后挪动的方法 解决EditText在光标位置插入字符串,光标不会往后挪动的方法
EditText editor =
(EditText)getCurrentView();
int cursor =
editor.getSelectionStart();
editor.getText().insert(cursor,delta);
......
▪ 手机声音设立SensorListener及AudioManager 手机声音设置SensorListener及AudioManager
我们先要做的就是创建SensorManager对象完事我们在声明一个以私有类成员存储AudioManager模式,下面就是我们要创建SensorManager对象,取得SENSOR_SERVICE的服务.........
[1]Concurrent并发库常见有关问题总结
来源: 互联网 发布时间: 2014-02-18
Concurrent并发库常见问题总结
对于Android开发者来说掌握Java的concurrent并发库十分重要,本次Android123就并发库的一些常见问题做总结:
1. 原子操作
如果你过去开发过Win32驱动可能发现很多Native API都是有关原子操作的(atomic operation),对于Java来说int、boolean这样的类型是原子的,而long和double就没有那么幸运了。原子操作是什么呢? 比如说Java线程的停止,在早期的JDK中提供了Thread.stop方法,但这个并不是线程安全的,而目前我们停掉一个Java线程都是用一个boolean变量来设置一个标记,你考虑这个boolean标记的改变是通过外部的其他线程,这样产生的同步问题如何解释呢? 这就是原子操作带来的好处,对于Long型我们可以使用java 1.5以后加入的concurrent.atomic的AtomicLong,对于Android来说支持以下原子类型:
AtomicBoolean、AtomicInteger、AtomicIntegerArray、AtomicIntegerFieldUpdater<T>、AtomicLong、AtomicLongArray、AtomicLongFieldUpdater<T> 、AtomicMarkableReference<V> 、AtomicReference<V> 、AtomicReferenceArray<E>、AtomicReferenceFieldUpdater<T, V> 和AtomicStampedReference<V> 。
2. 并发库的CopyOnWriteArrayList
对于CopyOnWrite机制可以解决读取频繁,写入较少时的并发效果,有关这方面内容我们在 Android开发之Java并发包集合类性能分析 有过讲解。
3.
对于Android开发者来说掌握Java的concurrent并发库十分重要,本次Android123就并发库的一些常见问题做总结:
1. 原子操作
如果你过去开发过Win32驱动可能发现很多Native API都是有关原子操作的(atomic operation),对于Java来说int、boolean这样的类型是原子的,而long和double就没有那么幸运了。原子操作是什么呢? 比如说Java线程的停止,在早期的JDK中提供了Thread.stop方法,但这个并不是线程安全的,而目前我们停掉一个Java线程都是用一个boolean变量来设置一个标记,你考虑这个boolean标记的改变是通过外部的其他线程,这样产生的同步问题如何解释呢? 这就是原子操作带来的好处,对于Long型我们可以使用java 1.5以后加入的concurrent.atomic的AtomicLong,对于Android来说支持以下原子类型:
AtomicBoolean、AtomicInteger、AtomicIntegerArray、AtomicIntegerFieldUpdater<T>、AtomicLong、AtomicLongArray、AtomicLongFieldUpdater<T> 、AtomicMarkableReference<V> 、AtomicReference<V> 、AtomicReferenceArray<E>、AtomicReferenceFieldUpdater<T, V> 和AtomicStampedReference<V> 。
2. 并发库的CopyOnWriteArrayList
对于CopyOnWrite机制可以解决读取频繁,写入较少时的并发效果,有关这方面内容我们在 Android开发之Java并发包集合类性能分析 有过讲解。
3.
[2] 解决EditText在光标位置安插字符串,光标不会往后挪动的方法
来源: 互联网 发布时间: 2014-02-18
解决EditText在光标位置插入字符串,光标不会往后挪动的方法
EditText editor =
(EditText)getCurrentView();
int cursor = editor.getSelectionStart();
editor.getText().insert(cursor,delta);
int cursor = editor.getSelectionStart();
editor.getText().insert(cursor,delta);
[3] 手机声音设立SensorListener及AudioManager
来源: 互联网 发布时间: 2014-02-18
手机声音设置SensorListener及AudioManager
我们先要做的就是创建SensorManager对象完事我们在声明一个以私有类成员存储AudioManager模式,下面就是我们要创建SensorManager对象,取得SENSOR_SERVICE的服务了,我们在用switch来设置一下正常模式、正常模式、正常模式。我们现在就可以设置扑捉事件了,完事我们在进行判断,最后我们在单独写个类,也就是封装一下三个模式下(正常模式、正常模式、正常模式)都干谢什么。最后大家可要记住了,我们要写一个onPause类,这个类的主要目的就的覆盖onPause事件,取消mSensorListener 。大家可要记住了,一定要写onPause类,要不在运行的时候,就会出现错误。往往简单的地方就是爱犯错的地方。那么我们就来看看代码吧。
package eoe.phone;
import android.app.Activity;
import android.content.Context;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.widget.TextView;
public class EX06_12 extends Activity
{
/* 创建SensorManager对象 */
private SensorManager mSensorManager01;
private TextView mTextView01;
/* 以私有类成员存储AudioManager模式 */
private int strRingerMode;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView01 = (TextView)findViewById(R.id.myTextView1);
/* 创建SensorManager对象,取得SENSOR_SERVICE服务 */
mSensorManager01 =
(SensorManager)getSystemService(Context.SENSOR_SERVICE);
/* 取得现在的AudioManager模式 */
GetAudioManagerMode();
/* 依据现在的AudioManager模式,显示于TextView当中 */
switch(strRingerMode)
{
/* 正常模式 */
case AudioManager.RINGER_MODE_NORMAL:
mTextView01.setText(R.string.str_normal_mode);
break;
/* 静音模式 */
case AudioManager.RINGER_MODE_SILENT:
mTextView01.setText(R.string.str_silent_mode);
break;
/* 震动模式 */
case AudioManager.RINGER_MODE_VIBRATE:
mTextView01.setText(R.string.str_vibrate_mode);
break;
}
}
/* 创建SensorListener捕捉onSensorChanged事件 */
private final SensorListener mSensorListener =
new SensorListener()
{
@Override
public void onSensorChanged(int sensor, float[] values)
{
// TODO Auto-generated method stub
//float fRollAngle = values[SensorManager.DATA_X];
/* 取得Y平面左右倾斜的Pitch角度 */
float fPitchAngle = values[SensorManager.DATA_Y];
/* 正面向下(Y轴旋转),经实验结果为小于-120为翻背面 */
if(fPitchAngle<-120)
{
/* 先设置为静音模式 */
ChangeToSilentMode();
/* 再设置为震动模式 */
ChangeToVibrateMode();
/* 判断铃声模式 */
switch(strRingerMode)
{
/* 正常模式 */
case AudioManager.RINGER_MODE_NORMAL:
mTextView01.setText(R.string.str_normal_mode);
break;
/* 静音模式 */
case AudioManager.RINGER_MODE_SILENT:
mTextView01.setText(R.string.str_silent_mode);
break;
/* 震动模式 */
case AudioManager.RINGER_MODE_VIBRATE:
mTextView01.setText(R.string.str_vibrate_mode);
break;
}
}
else
{
/* 正面向上(Y轴旋转),经实验结果为大于-120为翻正面 */
/* 更改为正常模式 */
ChangeToNormalMode();
/* 调用更改模式后,再一次确认手机的模式为何 */
switch(strRingerMode)
{
case AudioManager.RINGER_MODE_NORMAL:
mTextView01.setText(R.string.str_normal_mode);
break;
case AudioManager.RINGER_MODE_SILENT:
mTextView01.setText(R.string.str_silent_mode);
break;
case AudioManager.RINGER_MODE_VIBRATE:
mTextView01.setText(R.string.str_vibrate_mode);
break;
}
}
}
@Override
public void onAccuracyChanged(int sensor, int values)
{
// TODO Auto-generated method stub
}
};
/* 取得当下的AudioManager模式 */
private void GetAudioManagerMode()
{
try
{
/* 创建AudioManager对象,取得AUDIO_SERVICE */
AudioManager audioManager =
(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null)
{
/* RINGER_MODE_NORMAL |
RINGER_MODE_SILENT |
RINGER_MODE_VIBRATE */
strRingerMode = audioManager.getRingerMode();
}
}
catch(Exception e)
{
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
/* 更改为静音模式 */
private void ChangeToSilentMode()
{
try
{
AudioManager audioManager =
(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null)
{
/* RINGER_MODE_NORMAL |
RINGER_MODE_SILENT |
RINGER_MODE_VIBRATE */
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
strRingerMode = audioManager.getRingerMode();
}
}
catch(Exception e)
{
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
/* 更改为震动模式 */
private void ChangeToVibrateMode()
{
try
{
AudioManager audioManager =
(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null)
{
/* 调用setRingerMode方法,设置模式 */
audioManager.setRingerMode
(
AudioManager.RINGER_MODE_VIBRATE
);
/* RINGER_MODE_NORMAL |
RINGER_MODE_SILENT |
RINGER_MODE_VIBRATE */
strRingerMode = audioManager.getRingerMode();
}
}
catch(Exception e)
{
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
/* 更改为正常模式 */
private void ChangeToNormalMode()
{
try
{
AudioManager audioManager =
(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null)
{
/* RINGER_MODE_NORMAL |
RINGER_MODE_SILENT |
RINGER_MODE_VIBRATE */
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
strRingerMode = audioManager.getRingerMode();
}
}
catch(Exception e)
{
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
@Override
protected void onResume()
{
// TODO Auto-generated method stub
/* 注册一个SensorListener的Listener */
/* 传入Sensor模式与rate */
mSensorManager01.registerListener
(
mSensorListener,
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_NORMAL
);
super.onResume();
}
@Override
protected void onPause()
{
// TODO Auto-generated method stub
/* 于覆盖onPause事件,取消mSensorListener */
mSensorManager01.unregisterListener(mSensorListener);
super.onPause();
}
}
我们先要做的就是创建SensorManager对象完事我们在声明一个以私有类成员存储AudioManager模式,下面就是我们要创建SensorManager对象,取得SENSOR_SERVICE的服务了,我们在用switch来设置一下正常模式、正常模式、正常模式。我们现在就可以设置扑捉事件了,完事我们在进行判断,最后我们在单独写个类,也就是封装一下三个模式下(正常模式、正常模式、正常模式)都干谢什么。最后大家可要记住了,我们要写一个onPause类,这个类的主要目的就的覆盖onPause事件,取消mSensorListener 。大家可要记住了,一定要写onPause类,要不在运行的时候,就会出现错误。往往简单的地方就是爱犯错的地方。那么我们就来看看代码吧。
package eoe.phone;
import android.app.Activity;
import android.content.Context;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.widget.TextView;
public class EX06_12 extends Activity
{
/* 创建SensorManager对象 */
private SensorManager mSensorManager01;
private TextView mTextView01;
/* 以私有类成员存储AudioManager模式 */
private int strRingerMode;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView01 = (TextView)findViewById(R.id.myTextView1);
/* 创建SensorManager对象,取得SENSOR_SERVICE服务 */
mSensorManager01 =
(SensorManager)getSystemService(Context.SENSOR_SERVICE);
/* 取得现在的AudioManager模式 */
GetAudioManagerMode();
/* 依据现在的AudioManager模式,显示于TextView当中 */
switch(strRingerMode)
{
/* 正常模式 */
case AudioManager.RINGER_MODE_NORMAL:
mTextView01.setText(R.string.str_normal_mode);
break;
/* 静音模式 */
case AudioManager.RINGER_MODE_SILENT:
mTextView01.setText(R.string.str_silent_mode);
break;
/* 震动模式 */
case AudioManager.RINGER_MODE_VIBRATE:
mTextView01.setText(R.string.str_vibrate_mode);
break;
}
}
/* 创建SensorListener捕捉onSensorChanged事件 */
private final SensorListener mSensorListener =
new SensorListener()
{
@Override
public void onSensorChanged(int sensor, float[] values)
{
// TODO Auto-generated method stub
//float fRollAngle = values[SensorManager.DATA_X];
/* 取得Y平面左右倾斜的Pitch角度 */
float fPitchAngle = values[SensorManager.DATA_Y];
/* 正面向下(Y轴旋转),经实验结果为小于-120为翻背面 */
if(fPitchAngle<-120)
{
/* 先设置为静音模式 */
ChangeToSilentMode();
/* 再设置为震动模式 */
ChangeToVibrateMode();
/* 判断铃声模式 */
switch(strRingerMode)
{
/* 正常模式 */
case AudioManager.RINGER_MODE_NORMAL:
mTextView01.setText(R.string.str_normal_mode);
break;
/* 静音模式 */
case AudioManager.RINGER_MODE_SILENT:
mTextView01.setText(R.string.str_silent_mode);
break;
/* 震动模式 */
case AudioManager.RINGER_MODE_VIBRATE:
mTextView01.setText(R.string.str_vibrate_mode);
break;
}
}
else
{
/* 正面向上(Y轴旋转),经实验结果为大于-120为翻正面 */
/* 更改为正常模式 */
ChangeToNormalMode();
/* 调用更改模式后,再一次确认手机的模式为何 */
switch(strRingerMode)
{
case AudioManager.RINGER_MODE_NORMAL:
mTextView01.setText(R.string.str_normal_mode);
break;
case AudioManager.RINGER_MODE_SILENT:
mTextView01.setText(R.string.str_silent_mode);
break;
case AudioManager.RINGER_MODE_VIBRATE:
mTextView01.setText(R.string.str_vibrate_mode);
break;
}
}
}
@Override
public void onAccuracyChanged(int sensor, int values)
{
// TODO Auto-generated method stub
}
};
/* 取得当下的AudioManager模式 */
private void GetAudioManagerMode()
{
try
{
/* 创建AudioManager对象,取得AUDIO_SERVICE */
AudioManager audioManager =
(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null)
{
/* RINGER_MODE_NORMAL |
RINGER_MODE_SILENT |
RINGER_MODE_VIBRATE */
strRingerMode = audioManager.getRingerMode();
}
}
catch(Exception e)
{
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
/* 更改为静音模式 */
private void ChangeToSilentMode()
{
try
{
AudioManager audioManager =
(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null)
{
/* RINGER_MODE_NORMAL |
RINGER_MODE_SILENT |
RINGER_MODE_VIBRATE */
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
strRingerMode = audioManager.getRingerMode();
}
}
catch(Exception e)
{
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
/* 更改为震动模式 */
private void ChangeToVibrateMode()
{
try
{
AudioManager audioManager =
(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null)
{
/* 调用setRingerMode方法,设置模式 */
audioManager.setRingerMode
(
AudioManager.RINGER_MODE_VIBRATE
);
/* RINGER_MODE_NORMAL |
RINGER_MODE_SILENT |
RINGER_MODE_VIBRATE */
strRingerMode = audioManager.getRingerMode();
}
}
catch(Exception e)
{
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
/* 更改为正常模式 */
private void ChangeToNormalMode()
{
try
{
AudioManager audioManager =
(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null)
{
/* RINGER_MODE_NORMAL |
RINGER_MODE_SILENT |
RINGER_MODE_VIBRATE */
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
strRingerMode = audioManager.getRingerMode();
}
}
catch(Exception e)
{
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
@Override
protected void onResume()
{
// TODO Auto-generated method stub
/* 注册一个SensorListener的Listener */
/* 传入Sensor模式与rate */
mSensorManager01.registerListener
(
mSensorListener,
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_NORMAL
);
super.onResume();
}
@Override
protected void onPause()
{
// TODO Auto-generated method stub
/* 于覆盖onPause事件,取消mSensorListener */
mSensorManager01.unregisterListener(mSensorListener);
super.onPause();
}
}
最新技术文章: