Trotz 2 Threads StrictModeException

T

TheJoe

Neues Mitglied
0
Hallo miteinander,

ich hab ein Problem mit Android 3.0 aufwärts.
Also foldende Ausgangspunkte:
Eine Activity diese steuert einen Thread über zwei Handler. Einer in der Activity und einer im Thread um miteinander kommunizieren zu können. Dies klappt wunderbar auf Android 2.3.4 (Handy). Auf Android 3.1 (Tablet) wirft er mir immer eine Exception (siehe Ende).
Meine momentane Vermutung besteht darin das er keinen eigenen Thread aufmacht bzw. darin arbeitet. Das Problem bei dieser Vermutung ist, das die ganzen Aktionen am Handy ohne freezes in der GUI ablaufen, also dennoch asyncron laufen.
Suchen bei Google führen immer dazu, dass ich beim connecten einen Thread/AsyncTask benutzen soll :(

Hat jemand eine Idee was ich falsch mach oder ändern muss?

Threadstart:
Code:
bridge = new Soundbridge(prefs.getString("ipaddress", ""), 5555, mainhandler);
bridge.start();
threadhandler = bridge.getHandler();
Häufiger wird die Threadklasse nicht angesprochen, nur noch über die internen Handler.

Code:
threadhandler.sendMessage(threadhandler.obtainMessage(1, params));

Exception:
Code:
FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
    at java.net.InetAddress.getAllByName(InetAddress.java:249)
    at java.net.Socket.tryAllAddresses(Socket.java:126)
    at java.net.Socket.<init>(Socket.java:204)
    at java.net.Socket.<init>(Socket.java:171)
    at de.equivalents.Soundbridge.connect(Soundbridge.java:41)
    at de.equivalents.Soundbridge.sendBefehl(Soundbridge.java:61)
    at de.equivalents.Soundbridge.getPresets(Soundbridge.java:165)
    at de.equivalents.Soundbridge.access$2(Soundbridge.java:164)
    at de.equivalents.Soundbridge$1.handleMessage(Soundbridge.java:226)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:132)
    at android.app.ActivityThread.main(ActivityThread.java:4025)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    at dalvik.system.NativeStart.main(Native Method)
 
Hallo,

ich habe das selbe Problem hat jemand eine Lösung dazu gefunden?

Danke
VG
 
Also Lösung nicht direkt den ich hab das Problem nicht gefunden.

Meine Klasse (Thread):

Code:
public class Soundbridge extends HandlerThread {
	private Handler mainhandler;

	public Soundbridge( Handler handler) {
		super("thread");
		mainhandler = handler;
	}
           @Override
	public void run() {
		super.run();
	}

	@Override
	public void interrupt() {
		disconnect();
		super.interrupt();
	}
	
	@Override
	protected void onLooperPrepared() {
		super.onLooperPrepared();
		threadhandler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				String[] params ;
				switch (msg.what) {
				case 1: // sendBefehl
					params = (String[]) msg.obj;
					mainhandler.sendMessage(mainhandler.obtainMessage(1, sendBefehl(params[1], params[2], Boolean.getBoolean(params[3]))));
					break;
				case 2: // getPresets
					mainhandler.sendMessage(mainhandler.obtainMessage(2, (Object[]) getPresets()));
					break;
				case 3: // getDisplaydata
					mainhandler.sendMessage(mainhandler.obtainMessage(3, getDisplaydata()));
					break;
				case 4: // connect
					params = (String[]) msg.obj;
					disconnect();
					soundbridgeip = params[1];
					soundbridgeport = Integer.getInteger(params[2],5555);
					break;
				case 5:
					quit();
				}
			};
		};
	}
}
Activity:
Code:
public class BridgeControll extends Activity {
	static Handler threadhandler;

	public BridgeControll() {
		bridge = new Soundbridge(mainhandler);
		bridge.start();
		threadhandler = bridge.threadhandler;
	}
	private Handler mainhandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1: // String

				break;
			case 2: // charsequenz
				CharSequence[] entries = (CharSequence[]) msg.obj;
				ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(BridgeControll.this,
						android.R.layout.simple_spinner_item, entries);
				adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
				Presetspinner.setAdapter(adapter);
				break;
			case 3: // Bitmap
				if (msg.obj != null)
					bridgeBild.setImageBitmap((Bitmap) msg.obj);
				break;
			}
		};
	};
}

In der Activity sende ich z.b.:
Code:
		String[] params = { "sendBefehl", command, befehl, output.toString() };
		threadhandler.sendMessage(threadhandler.obtainMessage(1, params));
In meiner Klasse rufe ich direkt die Funktion auf, wo mir die Werte zurückliefert.
Beim Beispiel (Klasse) Case 2 sende ich direkt wieder die Ausgabe zurück an die Acivity. Case 4 connectet nur mit den übergebenen Werten.
Die Übergabe welches Case(msg.what) benutzt wird, ist der erste Parameter von obtainMessage.
Hierbei gibt es keine Hilfe von der IDE. Wenn du ein Image von Thread an Activity sendest musst du das gesendete Objekt erst wieder richtig Konvertieren.

Ich hoffe ich konnte dir soweit helfen.
Mfg Joe
 

Ähnliche Themen

R
  • RalfKahl
Antworten
4
Aufrufe
168
RalfKahl
R
M
Antworten
2
Aufrufe
882
manunaut
M
W
  • waltsoft
Antworten
3
Aufrufe
721
waltsoft
W
Zurück
Oben Unten