我在onClickListener中调用它
AsyncTaskBindService asyncTaskBindService = new AsyncTaskBindService(position, songList);
asyncTaskBindService.execute();
异步任务类
public class AsyncTaskBindService extends AsyncTask<Void, Void, Void>{
private int songIndex;
private ArrayList<Song> songList;
public AsyncTaskBindService(int songIndex, ArrayList<Song> songList){
this.songIndex = songIndex;
this.songList = songList;
}
@Override
protected Void doInBackground(Void... voids) {
try {
if (getActivity() != null && !Main.mServiceIsBound) {
Main.bindMusicService(getActivity().getApplicationContext());
Log.i(TAG,"binding service!");
}
}catch (Exception e){
Log.e(TAG,"error binding Service!");
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
if (getActivity() != null && Main.mServiceIsBound) {
Main.mediaPlayerService.startActionPlay(getActivity().getApplicationContext(), songList, songIndex);
Log.i(TAG,"start song!");
}
}
问题出在我的 doInBackground 中:
这一行:
Main.bindMusicService(getActivity().getApplicationContext());
此方法调用另一个类中的bindService
,然后将实例返回到我的服务。
但问题是 Asynctask 完成了快速的方式,当调用onPostExecute
时它会返回一个 NPE,因为mediaPlayerService
仍然是空的,因为onServiceConnected
比我的 Asynctask 慢。
如何解决这个问题?
现在我必须单击一首歌曲 2 次才能开始播放。
编辑
首先我尝试了这个,但我的第二个如果永远不会被调用,因为在 onServiceConnected() 完成之前需要一些时间。
如果绑定服务已完成并且我的服务已绑定,如何立即执行我的第二个方法?
点击歌曲
if (!Main.mServiceIsBound && getActivity() != null) {
Main.bindMusicService(getActivity().getApplicationContext());
Log.i(TAG,"Service is not bound yet!, binding Service...");
}
if (getActivity()!= null && Main.mServiceIsBound) {
Main.mediaPlayerService.startActionPlay(getActivity().getApplicationContext(), songList, position);
}
主类
/**This establishes the connection to the MediaPlayerService. */
public static ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MediaPlayerService.MusicBinder binder = (MediaPlayerService.MusicBinder)service;
mediaPlayerService = binder.getService();
mServiceIsBound = true;
Log.i("Main","MediaPlayerService Connected!");
}
@Override
public void onServiceDisconnected(ComponentName name) {
mServiceIsBound = false;
Log.i("Main","MediaPlayerService Disconnected!");
}
};
public static void bindMusicService(Context c){
/*mediaPlayerServiceIntent binds our connection to the MediaPlayerService. */
try{
mediaPlayerServiceIntent = new Intent(c, MediaPlayerService.class);
c.bindService(mediaPlayerServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
}catch (Exception e){
Log.e("Main", "Service is not bound!");
}
Log.i("Main","Service is bound!");
}
这是因为AsyncTask
doInBackGround
异步运行,但是当您使用同样异步运行的bindService
将组件绑定到Service
时,会导致Main.bindMusicService
立即返回。
AsyncTask
不是这类工作的好候选人。应绑定到主线程(UI 线程)中的服务,并侦听ServiceConnection
对象的onServiceConnected
回调。