NetworkOnMainThreadException

M

MikeTheT

Gast
Hallo,

habe einen ganz simplen Server (PC) und einen Client(Emulator, Eclipse). Ich weiß das ab einer bestimmten, ich glaub 3.0, Android-Version die Netzwerkkomm. nicht mehr über den MainThread laufen darf. Bzw.: Es ist sowieso sinnlos... So gesagt getan, ich habe eine Klasse Server... ich habe eine Klasse ServerThread und trotzdem stürtzt meine APP am Emulator immer wieder ab(mit dem im Topic angegeben Error laut LogCat)... könnte auszucken häng seit Stunden an diesem sch**** Problem. Bin ganz neu in Java... Achja und bitte, umso simpler der Code gehalten wird umso besser...darauf steh ich. Im Netz findet man unzähliger komplizierter Lösungen die lauter Zusatzgadjets eingebaut haben die kein sch**** interessieren und es den Laien nur noch undurchschaubarer machen.

Danke für eure Zeit und hoffentlich schneller Lösungsansätze.

Hier der Code:
Java:
package server;

import java.io.*;
import java.net.*;

public class Server {
	
	
	public static void main(String[] args) {
		ServerSocket server = null;
		Socket s = null;
		// TODO Auto-generated method stub
		try {
			server = new ServerSocket(6012);
			System.out.println("Port frei und reserviert");
			while(true) {
			s = server.accept();
			ServerThread t = new ServerThread(s);
			t.start();
			server.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("Error im Try-Catch-Block!");
			e.printStackTrace();
		}
	}

}

Java:
package server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class ServerThread extends Thread {
	
	private Socket s;
	BufferedReader in = null;
	String user, password,email;
	
	public ServerThread(Socket s) {
		this.s=s;
	}
	
	public void run(){
		try {
			in = new BufferedReader(new InputStreamReader(s.getInputStream()));
			user = in.readLine();
			in.close();
			s.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("IOException im Server-Thread!");
		}
		System.out.println("User: " + user);
	}
	

}
 

JavaMeister

Gesperrter Benutzer
Also ich habe nicht viel Android programmiert. Aber der Code da oben sieht nicht aus, wie für Android geschrieben.

Und für Laien ist Android ehh nix. Du solltest erstmal mit Java SE anfangen.
 
Zuletzt bearbeitet:
M

MikeTheT

Gast
Hallo JavaMeister,

wie oben schon geschrieben, ist der Server auf meinem PC... dass oben sind zwei Serverklassen, zum einen der Server selbst, zum zweiten der ServerThread welche die NetworkOnMainThreadException umgehen sollte, es aber nicht passiert. logischerweise ist dadurch der Code auch reiner Java-Code und hat nichts mit Android zu tun, der Client-Code befindet sich am Emulator und ist daher "Android"-Code. Mich interessiert nur, warum er mir trotzdem einen NetworkOnMainTh....Exception ausgibt obwohl ich die hergestellte Verbindung an den ServerThread also einen Thread weitergebe. Irgendetwas habe ich übersehen. Und nein, ich bleib bei Android. Ich mache dass was ich mir in den Kopf gesetzt habe und lerne da auch am besten! ;-) Bitte könntest du dir den obigen Code nochmal ansehen und mir sagen wo ich hier etwas übersehen habe. Danke!

Anhang: Der Server startet ohne Probleme und geht bis zur accept() methode und wartet dort logischerweise auf einkommende Daten. SPiele ich allerdings meine APP auf den EMulator, und stelle bei OnCreate eine Verbindung zum Server her... crashed die APP mit der im Topic angegeben Exception...
 
Zuletzt bearbeitet von einem Moderator:
M

MikeTheT

Gast
Dann kanns ja nur mehr am Client liegen...

Hier der Code:
Java:
import java.io.*;
import java.net.*;

import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.widget.*;



public class MainActivity extends Activity {
	TextView user, password, email;
	Button confirm;
	Socket s = null;
	BufferedWriter out = null;
	public void confirmButtonClicked(View view) {
		user=(TextView)findViewById(R.id.editText1);
		password=(TextView)findViewById(R.id.editText2);
		email=(TextView)findViewById(R.id.editText4);

		try {
			out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
			out.write("User: " + user);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		try {
			s = new Socket("10.0.2.2",6012);
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Ich sehe auch hier keinen Fehler, logisch sonst wäre ich ja nicht hier. 10.0.2.2 ist die ip, falls sich der emulator am gleichen Device wie der Server befindet. Port 6012 ist zuvor vom Server reserviert worden und er lauscht dort. Anschließend habe ich einen Eventlistener auf dem Button "Confirm". Wird dieser geklickt sollen die Daten zum Server gesendet werden... Hier kann aber kein Fehler liegen da ich schon bei onCreate eine Verbindung zum Server herstellen zu versuche... und genau da crashed die App... sprich am Button und Eventhandler kanns nicht liegen..nur an dieser einen Zeile: s = new Socket("10.0.2.2",6012);.. Bitte um Hilfe..LG MIke

Anhang: Ich war auf allen STackoverflow-Seiten die Google zu dem Thema ausgespuckt hat... Lösung habe ich aber keine gefunden, nur unterschiedliche Ansätze wie runnable etc. Ich bin allerdings stur, und will dass mit Thread schaffen..da dass ja auch funktionieren sollte... Korrigiere mich bitte wenn ich falsch liege..
 
Zuletzt bearbeitet von einem Moderator:

JavaMeister

Gesperrter Benutzer
2 Fehler:

1. Dein Wissen reicht nicht aus, um das Problem zu begreifen.

2. Keine Lust mein StackOverFlow zu lesen. Zu verstehen und anzuwenden => Grund: falsche "Sturheit" und fehlendes Grundlagenwissen.
 

dzim

Top Contributor
Erstens: Das tritt nur auf Android-Seite auf.
Zweitens: Es geht darum, das keine (blockierenden) Netzwerkoperationen auf dem Hauptthread (GUI) gemacht werden sollen, damit die UI nicht einfrieren kann.
Drittens: Es ist mit irgendsoeinem abstrusen Code-Snippet immer noch möglich, ABER MAN SOLLTE ES EBEN EINFACH NICHT MACHEN! DAS IST UNSAUBER UND POTENTIEL GEFÄHRLICH... Caps Lock aus...
So betrachtet sagt der Klassenname "NetworkOnMainThreadException" eigentlich doch schon alles aus, gell?

Und um den Sack zu zu machen, lies bitte die JavaDoc des Android-SDK:
NetworkOnMainThreadException | Android Developers
 

Neue Themen


Oben