0

Android: App debuggen, wenn USB-Slot belegt ist (Hub/ WLAN)

Servus,
neulich wollte ich eine selbst geschriebene AndroidApp debuggen, welche per USB einen RFID-Reader angeschlossen hat. Also fällt die Möglichkeit weg, die App im Eclipse Emulator zu debuggen. Auch ein debugging über das USB-Kabel scheidet aus, weil mein Android-Gerät nur einen Micro-USB-Eingang hat…
Also als nächsten Schritt einen USB-Hub angeschlossen und daran dann den Reader und den PC. Der Reader wird erkannt – das Debugging funktioniert leider nicht.

Aber ich hab schließlich doch noch einen Weg gefunden, zu debuggen. Und zwar über WLAN!
Dazu:

  • Android-Gerät zum Debuggen per USB an den Rechner anschließen (Voraussetzung: Treiber schon installiert)
  • Eingabeaufforderung im android-sdk/platform-tools – Ordner öffnen und dort eingeben:
  • adb tcpip 5555
  • danach adb connect 192.178.178.72:5555 eingeben (die IP-Adresse auf die IP des Android-Geräts ändern
  • jetzt kann man das USB-Kabel entfernen und ganz normal mit Eclipse debuggen

Um Breakpoints nutzen zu können, muss im AndroidManifest.xml

android:debuggable=true

gesetzt werden

0

Android: ListView ausgewählte Elemente herausfinden

Hat man eine ListView, die mit Strings gefüllt ist und die Items per CheckBox ausgewählt werden können, so kann man folgendermaßen die markierten Einträge herausfinden:

SparseBooleanArray checkedItems = myListView.getCheckedItemPositions();
if (checkedItems != null) 
{
    for (int i = 0; i < checkedItems.size(); ++i) 
    {
        if (checkedItems.valueAt(i)) 
        {
            String item = myListView.getAdapter().getItem(checkedItems.keyAt(i)).toString();
            /* item is selected*/
        }
    }
}

Achtung: in Zeile 6 nicht checkedItems.get(i) verwenden, sonst kommt was Falsches raus!

0

Android: PostgreSQL connect() verursacht PSQLException

Versuche ich mit meiner Android-App (mit Funktionen, die in einer Wicket-Applikation funktionieren) auf eine Datenbank zuzugreifen, bekomme ich folgenden Fehler:

org.postgresql.util.PSQLException: Something unusual has occured to cause the driver to fail. Please report this exception.

org.postgresql.util.PSQLException: Something unusual has occured to cause the driver to fail. Please report this exception.
at org.postgresql.Driver.connect(Driver.java:287)
at java.sql.DriverManager.getConnection(DriverManager.java:175)
at com.j256.ormlite.jdbc.JdbcConnectionSource.makeConnection(JdbcConnectionSource.java:243)
at com.j256.ormlite.jdbc.JdbcConnectionSource.getReadWriteConnection(JdbcConnectionSource.java:182)
at com.j256.ormlite.jdbc.JdbcConnectionSource.getReadOnlyConnection(JdbcConnectionSource.java:168)
at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:228)
at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:181)
at com.j256.ormlite.stmt.StatementExecutor.queryForAll(StatementExecutor.java:113)
at com.j256.ormlite.dao.BaseDaoImpl.queryForAll(BaseDaoImpl.java:239)
at xxxxx
at xxxxx
at android.app.Activity.performCreate(Activity.java:5104)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
at android.app.ActivityThread.access$600(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
at java.net.InetAddress.getByName(InetAddress.java:289)
at java.net.InetSocketAddress.(InetSocketAddress.java:105)
at java.net.InetSocketAddress.(InetSocketAddress.java:90)
at org.postgresql.core.PGStream.(PGStream.java:60)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:101)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
at org.postgresql.jdbc2.AbstractJdbc2Connection.(AbstractJdbc2Connection.java:136)
at org.postgresql.jdbc3.AbstractJdbc3Connection.(AbstractJdbc3Connection.java:29)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.(AbstractJdbc3gConnection.java:21)
at org.postgresql.jdbc4.AbstractJdbc4Connection.(AbstractJdbc4Connection.java:31)
at org.postgresql.jdbc4.Jdbc4Connection.(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:393)
at org.postgresql.Driver.connect(Driver.java:267)
… 24 more

und daraus resultierend eine NullPointerException:

Uncaught exception thrown by finalizer
java.lang.NullPointerException
at org.postgresql.jdbc2.AbstractJdbc2Connection.close(AbstractJdbc2Connection.java:651)
at org.postgresql.jdbc2.AbstractJdbc2Connection.finalize(AbstractJdbc2Connection.java:1003)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
at java.lang.Thread.run(Thread.java:856)

Wie ich herausgefunden habe, liegt es an der Android SDK Version. Ab der Version 9 dürfen nämlich UI-Threads keine Verbindungen mit dem Internet mehr aufbauen, wenn man es ihnen nicht explizit erlaubt.

Lösung:
Am Anfang der onCreate()-Methode folgendes einfügen:

if (android.os.Build.VERSION.SDK_INT >= 9) 
{		
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
    StrictMode.setThreadPolicy(policy);
}
0

Android: Drehen des Bildschirms verhindern

Um die screen orientation in einer Android-App zu verhindern, muss man zwei Dinge tun.

Zum Einen muss in das AndroidManifest.xml

<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation|screenSize">

Zum anderen muss in die MainActivity.java noch eingefügt werde, wie bei einer Änderung der Konfiguration zu verfahren ist:

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
0

WPF: Mauszeiger ändern: Wartekreis

Um den Mauszeiger (Cursor) in einem WPF-Programm zu ändern, kann man folgende C#-Anweisungen ausführen:

Mouse.OverrideCursor = Cursors.Wait;
try
{
    // do
}
finally
{
    Mouse.OverrideCursor = null;
}

Durch den finally-Block ist sichergestellt, dass danach wieder auf Standard-Mauszeiger umgestellt wird.

Ein Überschreiben mit

this.Cursor = Cursors.Wait;

ist nicht ausreichend, da dadurch nur der Mauszeiger für ein Element geändert wird.

0

C#: Exceptions erneut werfen (rethrow)

Es wird immer empfohlen Exceptions erneut zu werfen, statt diese zu ignorieren, um diese in der aufrufenden Funktion zu bearbeiten. Denn eine Funktion die nicht selber wirft, wird als exception safe angesehen.
Doch beim erneut werfen muss man beachten, dass man dies richtig tut:

FALSCH:
catch (Exception ex)
{
    throw ex;
}

RICHTIG:
catch (Exception)
{
    throw;
}

Der Unterschied liegt darin, dass der Stacktrace im ersten Fall nicht die Funktion listet, welche die Ausnahme auslöst sondern nur die, die diese fängt.

Eine weitere Möglichkeit um das rethrowing korrekt auszuführen ist:

catch (Exception ex)
{
    throw new Exception("New infos to add", ex);
}

So können also zusätzliche Informationen hinzugefügt werden. Die ursprüngliche Exception und der Stacktrace bleiben in der InnerException erhalten.


Im Gegensatz zu Java gibt es in C# nicht die Möglichkeit anzugeben, welche Exceptions eine Funktion werden kann.