我在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慢。
如何解决这个问题?
现在我必须单击一首歌曲两次才能开始播放。
编辑
首先,我尝试了此操作,但是第二次尝试从未调用过,因为onServiceConnected()完成之前需要花费一些时间。
如果bindService完成并且服务被绑定,我如何立即执行第二种方法?
点击歌曲
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!");
}
答案 0 :(得分:0)
这是因为AsyncTask
的{{1}}是异步运行的,但是当您使用doInBackGround
将组件绑定到Service
时也会异步运行,导致bindService
立即返回。
Main.bindMusicService
不适用于此类工作。您应该绑定到主线程(UI线程)中的服务,并监听AsyncTask
对象的onServiceConnected
回调。