Hi Fabian,
ich habe jetzt mal einen eigenen Service geschrieben. Ich rufe den Service in der Activity auf, wenn ich auf einen Button drücke. Das klappt auch ganz gut. Nun versuche ich in dem Service die Verbindung zum Server herzustellen. Wenn ich das versuche, kann ich genau eine Nachricht senden und dann fliegt eine NullPointerException.
Vielleicht hilft das:
Serviceklasse:
public class MyService extends Service {
private TCPClient mTcpClient;
public void connection(){
mTcpClient.run();
}
}
TCPClient:
public class TCPClient {
/**Diese Methode handhabt die gesendeten
* und empfangenen Nachrichten*/
public void run() {
mRun = true;
try {
//IP-Adresse des Servers übergeben
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
//Sicherheitsausgabe an den Server senden
Log.e("TCP Client", "Kunde: Connecting..."
//Öffnet einen Socket, um eine Verbindung mit dem Server herzustellen
Socket socket = new Socket(serverAddr, SERVERPORT);
try {
//Sendet die Nachricht zum Server
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
//Sicherheitsausgabe an den Server
Log.e("TCP Client", "Kunde: Sent."
Log.e("TCP Client", "Kunde: Done."
//Empfange Nachrichen vom Server
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//Der Client achtet auf eingehende Nachrichten vom Server
while (mRun) {
serverMessage = in.readLine();
if (serverMessage != null && mMessageListener != null) {
//Ruft die Methode messageReveives von der MainActivity auf
mMessageListener.messageReceived(serverMessage);
}
serverMessage = null;
}
Log.e("RESPONSE FROM SERVER", "Werkstattserver: Received Message: '" + serverMessage + "'"
} catch (Exception e) {
//Sicherheitsausgabe an den Server zum Debuggen
Log.e("TCP", "Werkstattserver: Error", e);
//Dieser Block wird ausgeführt, wenn ein Error aufgetreten ist
} finally {
//Bei einem Error wird der Socket geschlossen.
socket.close();
}
} catch (Exception e) {
//Sicherheitsausgabe an den Server zum Debuggen
Log.e("TCP", "Kunde: Error", e);
}
}
Activity:
public class Werkstatt_Client extends Activity {
@Override
public void onCreate(Bundle savedInstanceState)
{
.
.
.
//OnClickListener für den Button Senden
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Werkstatt_Client.this,OBDService.class);
bindService(intent,serviceconntection,Context.BIND_AUTO_CREATE);
message = eingabe.getText().toString();
//Nachricht zum Verlauf hinzufügen
arrayList.add("Kunde: " + message);
//Nachricht an Server senden
if (mTcpClient != null) {
mTcpClient.sendMessage(message);
}
//aktualisiert die ListView bei neuen Nachrichten
mAdapter.notifyDataSetChanged();
eingabe.setText(""
}
});
}
private MyService service;
private ServiceConnection serviceconntection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
// TODO Auto-generated method stub
LocalBinder lbinder = (LocalBinder)binder;
service = lbinder.getService();
Log.e("","onServiceconnected"
service.connection();
}
};
/**Diese Methode äffnet einen TCPClient
* (Asynchroner Task)*/
public class connectTask extends AsyncTask<String,String,TCPClient> {
@Override
protected TCPClient doInBackground(String... message) {
//Öffnet einen TCP Client
mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() {
@Override
//Methode übernimmt den String
public void messageReceived(String message) {
publishProgress(message);
}
});
mTcpClient.run();
return null;
}
}
Und hier die passende LogCat:
06-02 19:11:59.236: E/AndroidRuntime(29287): FATAL EXCEPTION: main
06-02 19:11:59.236: E/AndroidRuntime(29287): java.lang.NullPointerException
06-02 19:11:59.236: E/AndroidRuntime(29287): at com.example.obdii.MyService.verbindung(OBDService.java:65)
06-02 19:11:59.236: E/AndroidRuntime(29287): at com.example.obdii.Werkstatt_Client$1.onServiceConnected(Werkstatt_Client.java:96)
06-02 19:11:59.236: E/AndroidRuntime(29287): at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1098)
06-02 19:11:59.236: E/AndroidRuntime(29287): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1115)
06-02 19:11:59.236: E/AndroidRuntime(29287): at android.os.Handler.handleCallback(Handler.java:615)
06-02 19:11:59.236: E/AndroidRuntime(29287): at android.os.Handler.dispatchMessage(Handler.java:92)
06-02 19:11:59.236: E/AndroidRuntime(29287): at android.os.Looper.loop(Looper.java:137)
06-02 19:11:59.236: E/AndroidRuntime(29287): at android.app.ActivityThread.main(ActivityThread.java:4921)
06-02 19:11:59.236: E/AndroidRuntime(29287): at java.lang.reflect.Method.invokeNative(Native Method)
06-02 19:11:59.236: E/AndroidRuntime(29287): at java.lang.reflect.Method.invoke(Method.java:511)
06-02 19:11:59.236: E/AndroidRuntime(29287): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
06-02 19:11:59.236: E/AndroidRuntime(29287): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
06-02 19:11:59.236: E/AndroidRuntime(29287): at dalvik.system.NativeStart.main(Native Method)
— geändert am 03.06.2014, 12:53:29
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.