Bu dersimizde androiddeki handler yapısını inceliyoruz.
Handler sınıfınu kullanarak threadler arasında veri gönderimi yapılabilir. Handle; ilgili threadin Mesaj Kuyruğuna Message ve Runnable nesneleri göndermenizi sağlar ve bu sayede siz bir worker thread’den main thread’e ulaşıp, ui elementleri güncelleyebilirsiniz.
Bir handler nesnesi oluşturduğunuzda o nesne oluşturduğunuz thread’in mesaj kuyruğuna ve threadine bağlanır. Mesaj gönderdiği gibi o mesajları almak için de yine handle nesnesini kullanırız.
Handler nesnesini handler.post(new Runnable) veya handler.sendMessage(Message msg) methodlarını kullanarak veri göndermek için kullanabiliriz. Runnable ile kullandığınızda işlem kuyruğa eklenir ve gerçekleştirilir. Message ile kullanıldığında ise handleMessage methodu tetiklenir. Böylece threadler arasında veri gönderme işlemini yapabilir, worker thread’den veri alıp onu main thread üzerinde çalıştırabilirsiniz.
Bu derste yazılan kodlar aşağıdaki gibidir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
public class MainActivity extends AppCompatActivity { Thread thread; ProgressBar progressBar; TextView textView; Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressBar = (ProgressBar) findViewById(R.id.progressBar); textView = (TextView) findViewById(R.id.textView); thread = new Thread(new MyThread()); thread.start(); handler = new Handler() { @Override public void handleMessage(Message msg) { progressBar.setProgress(msg.arg2); textView.setText("" + msg.arg1); } }; } private class MyThread implements Runnable { int i = 0; @Override public void run() { for (i = 0; i < 100; i++) { try { Thread.sleep(500); /*runOnUiThread(new Runnable() { @Override public void run() { textView.setText(""+i); } });*/ /*textView.post(new Runnable() { @Override public void run() { textView.setText(""+i); } });*/ Message mesajim = Message.obtain(); mesajim.arg1 = i; mesajim.arg2 = i; //handler.sendMessage(mesajim); handler.sendMessageDelayed(mesajim, 1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.emrealtunbilek.handleranlatimi.MainActivity"> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:indeterminate="false" android:max="100" android:progress="0" android:layout_centerVertical="true" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/progressBar" android:layout_centerHorizontal="true" android:layout_marginTop="32dp" android:text="TextView" /> </RelativeLayout> |