Android:我应该如何优化此AIDL代码&避免竞争条件

时间:2012-08-22 14:49:29

标签: java android android-service aidl

我正在创建一个媒体播放器应用。

当我启动或恢复应用程序时,我想检查媒体播放器是否已播放歌曲。

如果是,我会将暂停/播放ToggleButton设置为暂停,否则之前没有播放,则按钮将设置为播放

(例如,如果用户已经在使用媒体播放器并通过按下主页或后退按钮离开应用程序&现在他恢复播放器。则应正确配置按钮。)

实际的MediaPlayer对象在Service& amp;所有通信都是通过AIDL interface方法完成的。

现在,

  1. onResume我正在调用AsynTask method来检查所有内容 正在运行的服务并检查我的MusicService是否也在运行。
  2. 如果是,那么我正在呼叫aidl method以检查是否 mediaPlayer.isPlaying()是否属实。
  3. 如果是,则toggleButton将设置为暂停(即当前 玩),否则玩。
  4. 问题: 这个AsyncTask正在创造竞争条件。有时它会像预期的那样运行。有时它会抛出错误

    代码:

    // In onResume
    protected void onResume() {
        new PlayerStatusCheck().execute();
    }
    
    //AsyncTask Class
    class PlayerStatusCheck extends AsyncTask {
        boolean isServiceAvailable;
        private boolean isMyServiceRunning() {
            ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            for (RunningServiceInfo service : manager
                    .getRunningServices(Integer.MAX_VALUE)) {
                if (com.example.playingworking.MusicService.class.getName()
                        .equals(service.service.getClassName())) {
                    return true;
                }
            }
            return false;
        }
    
        @Override
        protected Object doInBackground(Object... params) {
            isServiceAvailable = isMyServiceRunning();
            return null;
        }
    
        @Override
        protected void onPostExecute(Object result) {
            try {
                if (!isServiceAvailable) {
                    doInBackground(null);
                } else {
                    if (aidlObject.isMediaPlaying()) {
                        tbPlayPause.setChecked(true);
                    } else {
                        tbPlayPause.setChecked(false);
                    }
                }
            } catch (RemoteException e) {
                Toast.makeText(MainActivity.this,
                        "MainActivity onPostExecute: " + e.toString(),
                        Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    MusicService中的代码:

    //In IBinder onBind()
    public boolean isMediaPlaying(){
        if(mediaPlayer.isPlaying()){
            return true;
        }
        return false;
    }
    

    请建议......谢谢

0 个答案:

没有答案