2016-05-12 19 views
0

メインアクティビティクラスでサービスのメソッドを呼び出そうとするとエラーが発生します。アンドロイドサービスメソッド呼び出しがヌル参照エラーを呼び出す

エラーログ

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のアプリケーション開発には新しいです。事前

答えて

0

で おかげでonServiceConnectedに以下のコードを入れてください:サービスが接続されます

TextView user = (TextView) findViewById(R.id.user); user.setText(Myservice.getUser());` 

ない限り、あなたは、サービスオブジェクトのメソッドにアクセスすることはできません。

+0

bindServiceはすでにサービスにアクティビティを接続していないはずです。サービスが接続された後で、その下のコードが実行されるはずですか? – Ash

+0

いいえ。最初に接続してから使用してください。参照先のサービスオブジェクトに接続する前に確認できます。明らかにそれはNPEを投げるだろう – Sush

関連する問題