我正在开发报警应用程序。
我使用广播接收器来接收闹钟时间。
当闹钟响起时,我会显示一个启动铃声&使用AsyncTask振动2分钟。
在本次活动中,我有两个名为
当我按下任何一个按钮时,它的点击事件会延迟触发,因为我在按下按钮时因为asyncTask在backgroung中运行而无法点击(播放铃声)。
我读到asyncTask在单独的线程上运行,
比我的按钮点击事件应该按下时触发,但在这种情况下它没有相同。
如果有任何身体有这种情况并得到解决方案那么请建议我!
以下是我的代码
叫做使用:
new RingtonePlay ().execute("");
以下是实施。
public class RingtonePlay extends AsyncTask<String,Void, String>
{
@Override
protected void onPreExecute()
{
super.onPreExecute();
try
{
audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
originalVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
vibratorObj = (Vibrator)mContext.getSystemService(Context.VIBRATOR_SERVICE);
volume = originalVolume;
listObjs.clear();
listObjs.add(audioManager);
listObjs.add(originalVolume);
listObjs.add(vibratorObj);
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
protected String doInBackground(String... params)
{
try
{
Cursor cursorSettings = dbHelper.getAllRecords(Info.SETTINGS);
if(cursorSettings!=null && cursorSettings.getCount()>0)
{
cursorSettings.moveToFirst();
durationInMilliSeconds = cursorSettings.getString(cursorSettings.getColumnIndex(Info.DEFAULT_DURATION));
vibrate = cursorSettings.getInt(cursorSettings.getColumnIndex(Info.DEFAULT_VIBRATE));
if(toneName.equals(""))
{
toneName = cursorSettings.getString(cursorSettings.getColumnIndex(Info.DEFAULT_TONE_NAME));
tonePath = cursorSettings.getString(cursorSettings.getColumnIndex(Info.DEFAULT_TONE_PATH));
}
listObjs.add(vibrate); // For vibration [ YES = 1, NO = 0]
}
else
{
listObjs.add(0); // For vibration [ YES = 1, NO = 0]
}
if(cursorSettings!=null)
cursorSettings.close();
durationInMilliSeconds = 5000;
ringTone = RingtoneManager.getRingtone(mContext, tonePathURI);
if(ringTone!=null)
{
ringTone.play();
}
if(ringTone==null && vibrate==0)
{
// No need to start any counter...
}
else
{
timer = new MyCountDownTimer(durationInMilliSeconds, 1000, ringTone, mContext, listObjs);
timer.start();
}
}
catch (Exception e)
{
e.printStackTrace();
}
return "";
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
}
}
答案 0 :(得分:2)
在AsyncTask
中的4个函数中,只有doInBackground()
在主UI线程的自己的Thread中运行。因此,请确保您正在doInBackground()
内播放铃声,并且您正在使用AsyncTask
功能启动execute()
。
AsyncTask.doInBackground()
而不是执行Button
,否则 AsyncTask
不会阻止您的while()
按键被触发。
据推测,你有一个简短的声音文件,你正在反复播放2分钟
每次声音结束播放时,您应该检查几件事情以决定是否应该再次播放。 doInBackground()
中的Button
循环适用于此。
AsyncTask
按下可以修改两分钟时间。