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.