如何仅在doinback中的方法完成时调用onPostExecute?



我在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!");
}

这是因为AsyncTaskdoInBackGround异步运行,但是当您使用同样异步运行的bindService将组件绑定到Service时,会导致Main.bindMusicService立即返回。

AsyncTask不是这类工作的好候选人。应绑定到主线程(UI 线程)中的服务,并侦听ServiceConnection对象的onServiceConnected回调。

最新更新