1

我正在开发警报应用程序。

我使用广播接收器来接收闹钟时间。

当闹钟时间到时,我会显示一个使用 AsyncTask 启动铃声和振动 2 分钟的活动。

在这个活动中,我有两个名为



当我按下这些按钮中的任何一个时,它的点击事件会延迟触发,这意味着由于 asyncTask 在背景中运行(播放铃声)而在我按下按钮时没有被点击。

我读到 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);
    }
}
4

1 回答 1

2

中的 4 个函数中AsyncTask,只有doInBackground()在主 UI 线程之外的自己的线程中运行。因此,请确保您是从内部播放铃声,doInBackground()AsyncTask从其execute()功能开始。

AsyncTask.doInBackground()除非Button您直接调用它而不是执行AsyncTask.

大概,你有一个简短的声音文件,你一遍又一遍地播放了 2 分钟。
每次声音播放完毕时,您都应该检查几件事来决定是否应该再次播放。内部的while()循环doInBackground()可以很好地解决这个问题。

  • 如果两分钟过去了,请不要再次播放声音。
  • 您的“加号”和“减号”Button按可以修改两分钟的时间。
  • 您可以添加一个“停止”按钮以将时间归零并 AsyncTask在下一个周期停止。
于 2013-04-25T05:54:54.400 回答