(一)在主Activity里面新起一个Service后台搜索自身Wifi,并将wifi信息返回到主Activity里面,然后显示在主Activity 的TextView上面,结果空指向异常出错:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xiaoniu.server/com.xiaoniu.server.XiaoNiuServer}: java.lang.NullPointerException
ServerService.java是运行的后台程序,返回I到主Activity的IP信息部分代码为:
private MyBinder binder=new MyBinder();
public class MyBinder extends Binder
{
public String getIP()
{
System.out.println("....getIP()...."+serverIP);
return serverIP;
}
}
然后主Activity接受后台返回的数据,显示在server_ip_info_textView上面.源代码如下,结果报错.
//定义一个ServiceConnection对象
private ServiceConnection conn=new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
System.out.println("--Service Connected--");
binder=(ServerService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name)
{
System.out.println("--Service Disconnected--");
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
final Intent serviceIntent=new Intent();
serviceIntent.setAction("com.xiaoniu.server.Server_Service");
//绑定指定的Service
bindService(serviceIntent,conn,Service.BIND_AUTO_CREATE);
System.out.println("后台运行中,继续往下执行");
server_ip_info_textView.setText(binder.getIP());
}
其他地方都没有问题,运行程序后,出现:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xiaoniu.server/com.xiaoniu.server.XiaoNiuServer}: java.lang.NullPointerException的异常错误知道是空指向异常,但是,不知道哪里出错.,查了好久,发现,如果把OnCreate()里面这一句注释掉,程序就不会报错.
server_ip_info_textView.setText(binder.getIP());
也就是问题出现在这里了.那么,为什么会这样呢?查了资料,知道主Activity与Service连接成功将回调ServiceConnection对象的
onServiceConnected(ComponentName name, IBinder service)方法,该方法中有一个IBinder对象,该对象是实现主Activity与被绑定Service之间通讯的桥梁.而我所写的代码在Oncreate()里面,在他们还没有连接成功的时候,就直接引用binder.结果当然报出空指向异常错误.
修改的方法很简单,将OnCreate()方面里面出错的那一句: server_ip_info_textView.setText(binder.getIP()); 放到 onServiceConnected(ComponentName name, IBinder service)方法中去执行,就没有问题了.如下面所示:
//定义一个ServiceConnection对象
private ServiceConnection conn=new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
System.out.println("--Service Connected--");
binder=(ServerService.MyBinder) service;
server_ip_info_textView.setText(binder.getIP());
}
@Override
public void onServiceDisconnected(ComponentName name)
{
System.out.println("--Service Disconnected--");
}
};
(二) 在屏幕横竖屏切换的时候,出现has leaked ServiceConnection that was originally bound here
可能的一个原因是:你在oncreate()里面已经启动了一个service,但是你的android设备横竖屏状态发生了改变,这里,系统会重新执行OnCreate()方法,重复启动service,所以,就报了以上错误.
解决的一个方法:可以让程序在切换横竖屏的时候不自动重新运行OnCreate()方法.要想达到这样的效果,可以在mainfest配置文件里面,相应的Activity里面添加下面语句:
android:configChanges="keyboardHidden|orientation"
注意,如果在androidf4.0以上系统,则应改为:
android:configChanges="keyboardHidden|orientation|screenSize"
另外一个问题,如果我们确实需要在横竖屏切换的时候,增加一些操作呢?可以这样做,当我们添加了以上的语句了,横竖屏切换的时候,不会触动OnCreate()方法,但是,它会自动执行
public void
onConfigurationChanged(Configuration newConfig),所以,可以在这个里面进行相应操作.
如:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
{
Log.v(TAG, "ORIENTATION_LANDSCAPE");
}
if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
{
Log.v(TAG, "ORIENTATION_PORTRAIT");
}
if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO)
{
}
else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES)
{
}
}