サービスめちゃくちゃ異常解決に関する要約(更新中)

5050 ワード

(一)メインActivityの中に新しいサービスバックグラウンドを作って自分の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.Null PointerExceptionの異常エラーは空指向異常であることを知っていますが、どこが間違っているのか分かりません.長い間調べたところ、OnCreate()の中のこの一言を注釈すれば、プログラムは間違っていないことが分かった.
server_ip_info_textView.setText(binder.getIP());
つまり問題はここに現れた.では、なぜそうなるのでしょうか.資料を調べてみると、プライマリActivityとServiceの接続が正常に行われ、ServiceConnectionオブジェクトがコールバックされることがわかります.
マスターActivityとバインドされたサービスとの間の通信を実現するブリッジであるIBinderオブジェクトがある.私が書いたコードはOncreate()の中にあり、彼らがまだ接続に成功していないときはbinderを直接引用します.その結果、空指向異常エラーは当然報告される.
修正方法は簡単で、OnCreate()側のエラーの一言:server_ip_info_textView.setText(binder.getIP());次のように、onServiceConnected(ComponentName,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が現れる
可能性の1つの原因は:あなたはoncreate()の中ですでにサービスを起動しましたが、あなたのandroidデバイスの縦画面の状態が変わりました.ここで、システムはOnCreate()の方法を再実行し、サービスを繰り返し起動します.だから、以上のエラーを報告しました.
解決の1つの方法:プログラムが縦横スクリーンを切り替える時に自動的にOnCreate()方法を再実行しないようにすることができる.このような効果を達成するには、mainfestプロファイルに次の文を追加します.
 
 android:configChanges="keyboardHidden|orientation"

 
注意android f 4.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)
    { 
    }
}