Application 执行耗时任务初始化数据,在activty 获取时出现空指针异常怎么办?

如题,在Application 绑定了一个service 但是返回binder 并赋值这个操作特别慢
导致在 Activity 中通过Application 的方法获取到的 binder 一直是空值。请问我该如何处理,才能获取到 ?

application 中代码:

public class MyApplication extends Application {
private MusicPlayService.PlayServiceBinder msbinder;
private ServiceConnection mConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d("绑定并开启服务","绑定成功");
//获取到bindler 了 可以并转成service 可以调用里面的方法了
msbinder= (MusicPlayService.PlayServiceBinder) service;
msbinder=getbinder();
Log.d("返回bindler",""+msbinder.toString());
}

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};

@Override
public void onCreate() {
    super.onCreate();
    Intent intent=new Intent(this,MusicPlayService.class);
    startService(intent);
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

//获取绑定的Binder
public MusicPlayService.PlayServiceBinder getbinder(){
if(msbinder!=null){
Log.d("msbinder不为空","不为空");
}else {
Log.d("msbinder为空","空");
}
return msbinder;
}
}

activity中代码:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
application= (MyApplication) getApplication();
mSbinder=application.getbinder();
}

onServiceConnected连接完成之后回调,用binder的时候可能还没连接服务完成,所以是空
两种解决方法,回调和handler

回调:

1.定义回调接口
public interface TestListener {

public void onCompleted();

}
2.MyApplication
public class MyApplication extends Application {

private TestListener mListener = null;

@Override
public void onCreate() {
    super.onCreate();
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if(mListener!=null){
                mListener.onCompleted(); // 这里在你的onServiceConnected回调里面调用
            }

        }
    }, 1000);
}

public void setListener(TestListener l){
    mListener = l;
}

}

3.Activity注册回调
MyApplication app = (MyApplication) getApplication();
app.setListener(new TestListener(){

        @Override
        public void onCompleted() {
            Log.d("", "test listener");// 绑定服务完成之后回调这里
        }

    });

Handler

具体代码不写了,思路就是绑定服务不在Application里面,写一个Activity的基类BaseActivity,在这里面绑定服务,定义一个handler,其他每个Activity都继承这个基类,这样每个activity都有一个handler实例,可以互相传递消息

在Application 里面定义一个回调接口,这个办法穿值

http://www.cnblogs.com/rollenholt/p/3612440.html

你可以先判定是否为空再调用呀

建议你可以通过异步线程+handler回调处理的方式,来解决

异步的应该不行吧,你不知道什么时候service执行完,所以你在Activity中获取binder 的时候,有可能为空

你先把你的Application里面的代码,以及你在Activity中哪里有引用的代码贴出来,看下

那就在Application中加载完成后再进入程序啊

可以通过eventbus传递,在接受的地方判断下