Um mich in Java und die Android Entwicklung einzufinden, habe ich eine einfache Binär-Uhr programmiert.
Die Uhrzeit wird dabei in Stunden, Minuten, Sekunden umgewandelt.
Diese drei Werte in einen Binär-String umgewandelt und dieser auf 5 Zeichen für die Stunden und 6 Zeichen für Min/Sek formatiert.
Je nachdem ob an den Stellen 1 - 5 (6) eine 0 oder eine 1 ist, wird ein ImageView angezeigt/ausgeblendet.
Soweit funktioniert auch alles.
Nach einigen Minuten wird allerdings alles sehr langsam. "Tastendrücke" reagieren sehr spät (nach sehr langer Zeit gar nicht mehr), der animierte Hintergrund wird statisch und Musik hört auf zu spielen.
Beim Emulator unter Windows 7 ist es genau das gleiche, jedoch schon nach kürzerer Zeit.
Prozessorauslastung ist bei beiden Systemen im normalen Bereich, Android 2% und Windows zwischen 15% und 20%.
Allerdings wird der Speicherverbrauch unter Windows in etwa 4KB größer mit jeder Sekunde.
Ich habe so gut wie alle Variablen schon außerhalb deklariert und bin deshalb ratlos. Normalerweise hat jede App ja auch einen begrenzten Speicher zur Verfügung, deswegen dürfte ja nicht das ganze System darunter leiden..
Der relevante Code:
public String dec2bin(int decimal)
{
digits = "01";
binary = "";
while(decimal != 0)
{
binary = digits.charAt(decimal % 2) + binary;
decimal = decimal / 2;
}
return binary;
}
protected void setTimer()
{
taskHandler = new Handler();
Ticker = new Runnable() {
public void run()
{
runNextTask();
//curDate = new Date();
//RV.setTextViewText(R.id.textView1, curDate.toLocaleString());
//AWM.updateAppWidget(AWI, RV);
if (isComplete) return;
now = SystemClock.uptimeMillis();
next = now + (1000 - now % 1000);
taskHandler.postAtTime(Ticker, next);
}
};
Ticker.run();
}
protected void runNextTask()
{
curDate = new Date();
Hours = curDate.getHours();
Mins = curDate.getMinutes();
Secs = curDate.getSeconds();
binSecs = dec2bin(Secs);
int len = binSecs.length();
if( len < sFillStrWithWantLen.length() )
binSecs = (sFillStrWithWantLen + binSecs).substring(len);
RV.setViewVisibility(R.id.ImageView36, ((binSecs.charAt(0) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView35, ((binSecs.charAt(1) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView34, ((binSecs.charAt(2) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView33, ((binSecs.charAt(3) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView32, ((binSecs.charAt(4) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView31, ((binSecs.charAt(5) == '0') ? -1 : 0));
String binMins = dec2bin(Mins);
len = binMins.length();
if( len < sFillStrWithWantLen.length() )
binMins = (sFillStrWithWantLen + binMins).substring(len);
RV.setViewVisibility(R.id.ImageView26, ((binMins.charAt(0) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView25, ((binMins.charAt(1) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView24, ((binMins.charAt(2) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView23, ((binMins.charAt(3) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView22, ((binMins.charAt(4) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView21, ((binMins.charAt(5) == '0') ? -1 : 0));
String binHours = dec2bin(Hours);
len = binHours.length();
if( len < sFillStrWithWantLenH.length() )
binHours = (sFillStrWithWantLenH + binHours).substring(len);
RV.setViewVisibility(R.id.ImageView15, ((binHours.charAt(0) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView14, ((binHours.charAt(1) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView13, ((binHours.charAt(2) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView12, ((binHours.charAt(3) == '0') ? -1 : 0));
RV.setViewVisibility(R.id.ImageView11, ((binHours.charAt(4) == '0') ? -1 : 0));
// RV.setTextViewText(R.id.textView1, String.format("%d", new Random().nextInt()));
AWM.updateAppWidget(AWI, RV);
}
Alles anzeigen
RV ist das RemoteView-Objekt, das in onUpdate erstellt wird und
AWM der AppWidgetManager auch aus onUpdate.
Vielleicht fällt jemandem etwas dazu ein? Es ist mir wie gesagt ein Rätsel woher und wie das Widget ein Handy "aufhängen" kann..