Nela 2016-10-28 13:13 采纳率: 100%
浏览 2759
已采纳

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();
}

  • 写回答

9条回答 默认 最新

  • developerzjy 2016-11-04 04:33
    关注

    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实例,可以互相传递消息

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器