如何在使用AsyncTask时处理按钮单击?

时间:2013-04-25 05:43:36

标签: android android-asynctask

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

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

当闹钟响起时,我会显示一个启动铃声&使用AsyncTask振动2分钟。

在本次活动中,我有两个名为

的按钮
  1. 加上
  2. 减号
  3. 当我按下任何一个按钮时,它的点击事件会延迟触发,因为我在按下按钮时因为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);
        }
    }
    

1 个答案:

答案 0 :(得分:2)

AsyncTask中的4个函数中,只有doInBackground()在主UI线程的自己的Thread中运行。因此,请确保您正在doInBackground()内播放铃声,并且您正在使用AsyncTask功能启动execute()

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

AsyncTask不会阻止您的while()按键被触发。

据推测,你有一个简短的声音文件,你正在反复播放2分钟 每次声音结束播放时,您应该检查几件事情以决定是否应该再次播放。 doInBackground()中的Button循环适用于此。

  • 如果已经过了两分钟,请不要再播放声音。
  • 您的“加号”和“减号”AsyncTask按下可以修改两分钟时间。
  • 您可以添加“停止”按钮以将时间清零并停止 {{1}}在下一个周期。