如何仅在doinbackground中的方法完成后才调用onPostExecute?

时间:2019-07-06 02:11:16

标签: java android service android-asynctask

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

1 个答案:

答案 0 :(得分:0)

这是因为AsyncTask的{​​{1}}是异步运行的,但是当您使用doInBackGround将组件绑定到Service时也会异步运行,导致bindService立即返回。

Main.bindMusicService不适用于此类工作。您应该绑定到主线程(UI线程)中的服务,并监听AsyncTask对象的onServiceConnected回调。

相关问题