サービスめちゃくちゃ異常解決に関する要約(更新中)
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情報部分コードは以下の通りである.
その後、メインActivityはバックグラウンドから返されたデータを受け取り、server_に表示します.ip_info_textViewの上ソースコードは以下の通りで、結果は間違っています.
他の場所に問題はありません.プログラムを実行すると、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)メソッドで実行します.
(二)画面縦横切り替え時にhas leaked ServiceConnection that was originally bound hereが現れる
可能性の1つの原因は:あなたはoncreate()の中ですでにサービスを起動しましたが、あなたのandroidデバイスの縦画面の状態が変わりました.ここで、システムはOnCreate()の方法を再実行し、サービスを繰り返し起動します.だから、以上のエラーを報告しました.
解決の1つの方法:プログラムが縦横スクリーンを切り替える時に自動的にOnCreate()方法を再実行しないようにすることができる.このような効果を達成するには、mainfestプロファイルに次の文を追加します.
注意android f 4.0以上のシステムは、次のように変更します.
もう一つの問題は、もし私たちが本当に縦横画面を切り替える必要がある場合、いくつかの操作を増やす必要がありますか?このようにして、上記の文を追加し、縦画面を切り替えた場合、OnCreate()メソッドには触れませんが、自動的に実行されます.
public
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)
{
}
}