Buy Me A Coffee!

GoPay

Sunday, June 2, 2013

Teroka ganti jadi Thread+Runnable di Android

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 ini

05-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 :)