1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Trotz 2 Threads StrictModeException

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von TheJoe, 25.06.2011.

  1. TheJoe, 25.06.2011 #1
    TheJoe

    TheJoe Threadstarter Junior Mitglied

    Beiträge:
    32
    Erhaltene Danke:
    0
    Registriert seit:
    23.07.2009
    Phone:
    HTC Desire
    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)
    
     
  2. outbreaker1303, 13.09.2011 #2
    outbreaker1303

    outbreaker1303 Neuer Benutzer

    Beiträge:
    1
    Erhaltene Danke:
    0
    Registriert seit:
    13.09.2011
    Hallo,

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

    Danke
    VG
     
  3. TheJoe, 13.09.2011 #3
    TheJoe

    TheJoe Threadstarter Junior Mitglied

    Beiträge:
    32
    Erhaltene Danke:
    0
    Registriert seit:
    23.07.2009
    Phone:
    HTC Desire
    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
     

Diese Seite empfehlen