| |||||||
Das Thema "Trotz 2 Threads StrictModeException" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.
|
| | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Junior Mitglied | 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(); Code: threadhandler.sendMessage(threadhandler.obtainMessage(1, params)); 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) |
| | |
| | #3 (permalink) |
| Junior Mitglied |
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();
}
};
};
}
} 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;
}
};
};
} Code: String[] params = { "sendBefehl", command, befehl, output.toString() };
threadhandler.sendMessage(threadhandler.obtainMessage(1, params)); 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 |
| | |
![]() |
|
| Themen-Optionen | |
| Ansicht | |
| |
| ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Threads | stefan.bachert | Android App Entwicklung | 0 | 08.06.2011 17:33 |
| [how to] alte Threads | quercus | Anleitungen für das Sony Ericsson Xperia Arc | 45 | 30.05.2011 12:39 |
| Threads u. Handler | jim | Android App Entwicklung | 2 | 05.05.2011 15:12 |
| Threads ignorieren | matthes77 | Anregungen | 2 | 30.12.2010 11:50 |