Bener kan, banyak hal yang aneh-aneh kalau nggak pake Framework...
Awalnya
Beberapa waktu yang lalu Teroka menggunakan Asyntask. Kata Pak Yudi Asyntask gunanya untuk loading yang sebentar-sebentar, misalnya loading data dari internet, setelah itu tasknya diputus.Saat praktikum kami diajarkan untuk menggunakan Asyntask untuk animasi sederhana, gambar android gerak dari kiri ke kanan, animasi hanya dilakukan dengan looping sebanyak 50 kali. Lain halnya dengan Teroka, animasi akan dilakukan terus-menerus sampai aplikasinya ditutup. Nah ini yang jadi masalah.
Anehnya Error
Dengan Asyntask kurang tahu kenapa kadang animasinya jalan, kadang nggak. Waktu sedang mengerjakan Teroka anehnya Asyntask juga nggak bisa di-cancel. Setiap dilakukan Asyntask.cancel(true) muncul error seperti ini05-31 15:25:48.750: W/System.err(18305): java.lang.InterruptedException 05-31 15:25:48.800: W/System.err(18305): at java.lang.VMThread.sleep(Native Method) 05-31 15:25:48.800: W/System.err(18305): at java.lang.Thread.sleep(Thread.java:1031) 05-31 15:25:48.810: W/System.err(18305): at java.lang.Thread.sleep(Thread.java:1013) 05-31 15:25:48.810: W/System.err(18305): at com.tanyoo.teroka.AnimasiTask.doInBackground(AnimasiTask.java:27) 05-31 15:25:48.810: W/System.err(18305): at com.tanyoo.teroka.AnimasiTask.doInBackground(AnimasiTask.java:1) 05-31 15:25:48.810: W/System.err(18305): at android.os.AsyncTask$2.call(AsyncTask.java:264) 05-31 15:25:48.810: W/System.err(18305): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 05-31 15:25:48.820: W/System.err(18305): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 05-31 15:25:48.820: W/System.err(18305): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 05-31 15:25:48.830: W/System.err(18305): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 05-31 15:25:48.830: W/System.err(18305): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 05-31 15:25:48.830: W/System.err(18305): at java.lang.Thread.run(Thread.java:856)
Hoh.. nggak tahu deh kenapa.
Thread + Runnable, tapi Draw lama
Setelah konsultasi dengan dosen saya, ternyata memang tidak bisa dengan AsynTask, akhirnya menggunakan primitif Thread.Yang aneh itu drawing pada Thread ternyata agak lama, dan telat juga. Gawat kalau mau draw banyak bitmap, bisa-bisa gagal gara-gara Bitmapnya belum nyampe (akhirnya jadi NULL)
Solusinya adalah dengan menggunakan status bitmap sudah di load baru kemudian digambar.
Bitmap selama ini saya load di onWindowFocusChanged, jadi ada status yang namanya ready untuk menyatakan gambar sudah di proses dan di load dulu.
Coba lihat contoh di Help ini:
@Override public void onWindowFocusChanged(boolean hasWindowFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasWindowFocus); // resize gambar elogo.resizeImage((int)getPercentWidth(65), (int)getPercentHeight(19)); ePreviewGame.resizeImage((int)getPercentWidth(100), (int)getPercentHeight(56)); eButtonStatistik.EbuttonStat((int)getPercentWidth(42), (int)getPercentHeight(10)); eBackground.resizeImage((int)getPercentWidth(100),(int)getPercentHeight(100)); //set posisi elogo.setPosition(getPercentWidth(17), getPercentHeight(2)); ePreviewGame.setPosition(getPercentWidth(0), getPercentHeight(25)); eButtonStatistik.setPosition(getPercentWidth(29), getPercentHeight(88)); eBackground.setPosition(getPercentWidth(0), getPercentHeight(0)); ready = true; }Di paling akhir ada variabel ready kan? Nah itu dipanggil ketika thread berjalan. Ini yang saya lakukan ketika draw
public void doDraw(Canvas c){ if (c != null) { //clear screen c.drawColor(Color.WHITE); if (gameView.getReady()) { gameView.draw(c, cat); } } }
Lihat, pertama-tama dicek dulu apakah ready == true (saya lakukan dengan methode getReady), baru digambar.
Tapi ini masih ngelag
Lucu juga ketika tombol dipencet dia loading beberapa saat dulu baru keload gambarnya. Tapi lumayan lah, dan saat-saat menunggu tadi bisa diganti jadi loading, tapi yang penting sekarang itu fungsional dulu lah ya.
Masih ada error yang saya temui sekarang, kalau dari satu activity, ke activity lain, kemudian orientasi berubah, dan kembali ke activity sebelumnya kadang jadi error. Sepertinya letak untuk ready ada di salah satu state activity yang harus di handle.
Bagi kamu yang mau ngikutin kode yang saya, @ratihvuzy, @ndaindana, @yolahoshi, dan @rewingw buat bisa lihat di http://github.com/igrir/teroka :D
Oh tidak! Sudah tanggal 2! Sudah molor ini, harus bikin gamenya! Aaak!!
Wish us luck!
p.s: Tablet saya nggak mau ngecas kalo lagi jalan aplikasi dan dicoloknya di komputer. Kurang voltase kayaknya.
No comments:
Post a Comment
Comment is caring :)