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条)

报告相同问题?

悬赏问题

  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件
  • ¥15 visual studio2022中文乱码无法解决
  • ¥15 关于华为5g模块mh5000-31接线问题
  • ¥15 keil L6007U报错
  • ¥15 webapi 发布到iis后无法访问