有关Service 乱七八糟异常解决汇总(更新中)

(一)在主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)
    { 
    }
}



 

 

 

 

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值