メインアクティビティクラスでサービスのメソッドを呼び出そうとするとエラーが発生します。アンドロイドサービスメソッド呼び出しがヌル参照エラーを呼び出す
エラーログ
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String in.ac.iitkgp.alpha.dbService.getUser()' on a null object reference
at in.ac.iitkgp.alpha.MainScreen.onCreateOptionsMenu(MainScreen.java:95)
at android.app.Activity.onCreatePanelMenu(Activity.java:2846)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:341)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:258)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
私は最初の活動は、サービスへの入力を渡し、STARTSERVICE(意図)を使用して、それを起動する2つのアクティビティがあります。次のアクティビティを呼び出します。次に、次のアクティビティがサービスにバインドされ、入力データが読み込まれ、UIのTextViewが変更されます。 多くのアクティビティで入力が必要なので、サービスに渡す必要があります。第二の活動からの最初の活動から
Serviceクラス
public class dbService extends Service {
private final IBinder Mybinder = new dbBinder();
public String user;
public dbService() {
}
@Override
public IBinder onBind(Intent intent) {
return Mybinder;
}
public final String getUser(){
return user;
}
public class dbBinder extends Binder{
dbService getService(){
return dbService.this;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
user = intent.getStringExtra("User");
return START_NOT_STICKY;
}
}
スニペット
Intent intent = new Intent(this,MainScreen.class);
Intent service = new Intent(this,dbService.class);
String usr = user.getText().toString();
service.putExtra("User",usr);
startService(service);
startActivity(intent);
スニペット
dbService Myservice;
boolean bound = false;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
dbBinder binder = (dbBinder) service;
Myservice = binder.getService();
bound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
bound = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
.
.
.
Intent i = new Intent(this,dbService.class);
bindService(i,connection, Context.BIND_AUTO_CREATE);
TextView user = (TextView) findViewById(R.id.user);
user.setText(Myservice.getUser());
}
のみ第二の活動からサービスメソッドにアクセスすると、アプリがクラッシュします。他のすべてがうまくいくようです。 申し訳ありませんが、それはばかな質問です。私は、JavaとAndroidのアプリケーション開発には新しいです。事前
bindServiceはすでにサービスにアクティビティを接続していないはずです。サービスが接続された後で、その下のコードが実行されるはずですか? – Ash
いいえ。最初に接続してから使用してください。参照先のサービスオブジェクトに接続する前に確認できます。明らかにそれはNPEを投げるだろう – Sush