2010. július 7., szerda

EasyTop 0.1


Egy kicsit ugrunk. A hello world-öt, illetve egyéb alap dolgokat a dev guide, illetve egyéb leírások alapján egész egyszerűen össze lehet hozni. Most inkább egy konkrét feladat megoldását mutatnám be.

Többször is szükségem lett volna arra, hogy lássam melyik processz terheli le a telefon CPU-ját. Erre van ugyan megoldás a marketen is, de van olyan egyszerű a probléma, hogy érdemes lenne gyakorlásképpen megoldani.
A megoldás kulcspontjai:
  • top (ezt semelyik linuxosnak nem kell bemutatni)
  • egy handler objektum (h)
  • egy futtatható objektum (updateTimeTask)
A koncepció:

Egy activitynek jól meghatározható életciklusa van, ami csak user beavatkozásra iterálhat. Ezt úgy kell érteni, hogy pl. C-ben a main függvényben simán írhatunk egy ciklust, ami időközönként beolvassa top parancs kimenetét, majd megjeleníti, de itt nem járható ez az út.

Megoldás:

Szükségünk van egy objektumra, amely bizonyos időközönként beállítja egy textview szövegét, ez lesz az updateTimeTask, amely Runnable típusú. Ugyanis egy handler queue-jába ilyen típusú objektumokat is betehetünk, méghozzá úgy is, hogy a tényleges lefutás idejét eltolhatjuk (postDelayed). Az updateTimeTask run metódusában pedig egyszerűen saját magát kell beletennie a handler queue-jába, így kvázi rekurzióval tudunk iterálni.

Tehát hogy néz ki az activity-nk :
A textview, ami a kimenetet jeleníti meg:

private TextView tv;


A handler:
private Handler h = new Handler();

A futtatható objektumunk:

private Runnable updateTimeTask = new Runnable() {
public void run() {
refreshTv();
h.postDelayed(this, 1000);
};
};

Nézzük meg hogy a run metódusban frissíti a textview-t, majd beleteszi saját magát a handler queuejába. Amikor kikerül, és lefut, megint beteszi magát biztosítva a folyamatos frissítést.

A metódus, ami frissíti textview-t:

private void refreshTv() {
String text = ""; try {
InputStream ios = Runtime.getRuntime().exec("top -n 1 -m 5").getInputStream();
InputStreamReader iosReader = new InputStreamReader(ios);
BufferedReader bffr = new BufferedReader(iosReader);
String line;
while ((line = bffr.readLine()) != null ) {
if(line.trim().length() != 0) {
text = text + "\n" + line.trim();
};//else nop
};
} catch(Exception e) {
text = "IO error";
}; tv.setText(text);
//a kovetkezo kettot lehet, hogy eleg lenn Oncreate idoben
tv.setTextSize(12);
tv.setTypeface(Typeface.MONOSPACE,Typeface.NORMAL);
};
A koncepció system hívásként lefuttatva a topot elkajuk a kimenetét, feldolgozzuk, és a textview-nak értékül adjuk.

onCreate időben beállítjuk az alapdolgokat, és elindítjuk a folyamatot:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
refreshTv();
setContentView(tv); h.removeCallbacks(updateTimeTask);
h.postDelayed(updateTimeTask, 1000);
};

A megoldás korántsem a legjobb, de a legegyszerűbb, tehát tanuló programnak teljesen jó volt.

Az eredmény:


Amit lehet majd még javítani rajta:
  • táblázatos megjelenítés
  • frissítés külön threadben
  • különböző user által állítható paraméterek (pl most fixen 5 processz látszik csak)
A teljes kód letölthető innen.

Ha valami kérdés, probléma, óhaj, sóhaj merülne fel, akkor comment-ben jelezzétek.

2010. április 10., szombat

Android fejlesztői környezet összeállítása Ubuntun

Az első posztban Ubuntu 9.10-re állítjuk össze a fejlesztői környezetet.

Első lépésben letöltjük a hivatalos Android SDK-t innen. Csak ki kell csomagolni, ezzel most ennyi a teendő.

Ezután az eclipse következik:
sudo apt-get install eclipse
Miután a csomagkezelő végzett, elindítjuk az eclipset, és feltelepítjük a szükséges plugineket, ugyanis az Android Developer Tool (ADT) dependál néhány olyan kiegészítőn, ami nem a default telepítés része.

A Help -> Install New Software menüpontban http repositorykból telepíthetünk további kieglszítőket. A következő repókat kell felvennünk a "Work with" résznél:

Android Plugin
https://dl-ssl.google.com/android/eclipse/
Eclipse Modelling Farmework
http://download.eclipse.org/modeling/emf/updates/releases/
Graphical Editor Framework
http://download.eclipse.org/tools/gef/updates/releases/
WebTools
http://download.eclipse.org/webtools/updates/
Ha mindent hozzáadtunk, kiválasztjuk a legördülőből: "--All Available Sites--". Ekkor betöltödnek az elérhető csomagok, kiválasztjuk a "Developer Tools"-t, és feltelepítjük. Néhány NEXT gomb, és a licenc feltételek elfogadása után elkezdődik a telepítés. Amikor bejeződött célszerű újraindítani az eclipset (ezt fel is ajánlja), ezek után már csak Window -> Preferences dialógus ablak Android szekciójában kell megadnunk, hogy hova tömörítettük ki az Android SDK-t.

Most már megvan a fejlesztői környezetünk, a következő bejegyzésben pedig megcsináljuk az első Hello World programot.