2017-10-06 86 views
3

bindingservice在3個活動中,在2它運作良好,但在第3我有一個錯誤。Bindservice錯誤

這裏是我的服務:

public class ClientBluetoothService extends Service { 
    private Handler handler = new Handler(); 

    private final IBinder mBinder = new LocalBinder(); 

    private ClientBluetooth clientBT; 

    public class LocalBinder extends Binder { 
     ClientBluetoothService getSerivce() { 
      return ClientBluetoothService.this; 
     } 
    } 
    public ClientBluetoothService() { 
     clientBT = new ClientBluetooth(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    public void generateToast() { 
     Log.d("HERE", "Service: generateToast()"); 
     Toast.makeText(getApplicationContext(), "WITAJ W SERWISIE", Toast.LENGTH_SHORT).show(); 
    } 

    public void newClient() { 
     clientBT = new ClientBluetooth(); 
    } 

    public void start() { 
     clientBT.start(); 
    } 

    public String getStatus() { 
     return clientBT.getStatus(); 
    } 

    public void disconnect() throws IOException { 
     clientBT.disconnect(); 
    } 
} 

這裏是我的活動中,我有一個錯誤:

public class MeasureActivity extends AppCompatActivity { 

    protected boolean mBound = false; 
    private ClientBluetoothService clientBluetoothService; 

    private TextView textView; 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Intent intent = new Intent(this, ClientBluetoothService.class); 
     bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
     Log.d("HERE", "Measure: onStart()"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if (mBound) { 
      unbindService(mConnection); 
      mBound = false; 
     } 
    } 

    @Override 
    public void setTitle(CharSequence title) { 
     super.setTitle(title); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_measure); 

     setTitle("Measure"); 
     textView = (TextView)findViewById(R.id.textView); 
     clientBluetoothService.generateToast(); 
    } 

    private ServiceConnection mConnection = new ServiceConnection() { 

     @Override 
     public void onServiceConnected(ComponentName className, IBinder service) { 

      ClientBluetoothService.LocalBinder binder = (ClientBluetoothService.LocalBinder) service; 
      clientBluetoothService = binder.getSerivce(); 
      mBound = true; 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName arg0) { 
      mBound = false; 
     } 
    }; 
} 

而且我得到了一個錯誤:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.gmail.krakow.michalt.myecg.ClientBluetoothService.generateToast()' on a null object reference

回答

3

我不知道爲什麼它與其他2個活動一起工作,但在這種情況下,您很自然會得到NullPointerException。活動生命週期中的訂單是:

onCreate() - > onStart() - > onResume() - > onPause() - > onStop() - >和onDestroy()。 (https://developer.android.com/guide/components/activities/activity-lifecycle.html

clientBluetoothService在綁定到onStart中完成的服務後被初始化,然而它在onCreate中使用並且onCreate總是在onStart之前運行,這會導致NullPointerException。

如果您想確保在使用clientBluetoothService時初始化了mBound,mBound會非常有用。