Android

Android’te Thread, UI Thread ve ProgressDialog Kullanımı

Merhabalar arkadaşlar,

Bugün bir uygulama üzerinde Android’te progressdialog’un ve threadlerin kullanımından bahsedeceğim. Thread bir programın paralel ve asenkron işlem yapmasını sağlayan iş süreçleridir kısaca. Arka planda çalışma vb. durumlar için threadler kullanılır. Örneğin, webten bir veri aktaracağız; ama bu verinin gelmesi 5-10 saniye hatta daha fazla süre zarfında gerçekleşecek . Böyle bir durumda bu süre zarfında uygulamanın sadece bu işi yapmasını beklemek biraz saçma olacaktır. Bundan dolayı bu işlem için bir thread açabilir ve işlemi arka planda gerçekleştirebiliriz.

Bugün anlatacağım yöntemde de benzer bir durum söz konusu. Verilen bir sayıya kadar olan asal sayı adedini ve geçen işlem süresini bulan bir uygulama. Uygulama asal sayı adedini hesaplarken ekranda bir “Yükleniyor…” ibaresi (progressdialog) göreceğiz. Hesaplama işlemi tamamlandıktan sonra ise  asal sayı adedini ve geçen süreyi ekranda görebilileceğiz.

Android üzerinde UI thread, thread ve progressdilaog kullanımı konusunda sizlere yardımcı olacağını düşündüğüm uygulamanın Galaxy-S için ekran çıktılarını, kaynak kodlarını ve projenin .rar dosyasını yazının devamında bulabilirsiniz . Büyük sayılar için android cihazınızın performansını arkadaşlarınızla karşılaştırabileceğinizide eklemek isterim , iyi çalışmalar 😉

 



package tugrulasik.com.egitimler.progressdialog;
/*
 * Kod Tuğrul Aşık tarafından 09.03.2012 tarihinde yazılmıştır.
 * 
 * Daha fazla kod ve paylaşım için lütfen
 *
 *      www.tugrulasik.com 
 * 
 * adresini ziyaret ediniz.
 * 
 */
import java.util.Date;
 
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
 
/*
 * 
 * Runnable'dan implement ediyoruz...
 * 
 */
 
public class ProgressDialogveThreadActivity extends Activity implements
		Runnable {
 
	private Button hesaplaButon;
	private TextView sonucTV;
	private TextView gecenSureTV;
	private EditText girisET;
 
	Thread thread;
	ProgressDialog pd = null;
 
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
 
		girisET = (EditText) findViewById(R.id.editText1);
		sonucTV = (TextView) findViewById(R.id.textView1);
		gecenSureTV = (TextView) findViewById(R.id.textView3);
		hesaplaButon = (Button) findViewById(R.id.button1);
 
		hesaplaButon.setOnClickListener(new OnClickListener() {
 
			public void onClick(View v) {
 
				pd = ProgressDialog.show(ProgressDialogveThreadActivity.this,
						"", "Hesaplanıyor...", true, false);
 
				thread = new Thread(ProgressDialogveThreadActivity.this);
				thread.start();
 
			}
		});
 
	}
 
	/*
	 * 
	 * Verilen bir aralıktaki asal sayı adedini bulan method.
	 * 
	 * Fermat'ın küçük teoremine ve/veya Euler(Ispatlayan)teoremine
	 * göre hesaplanıyor.
	 * 
	 * Bir sayının karekökünden küçük sayıları bölen kabul et.
	 * ebob(a,bölenler)=1 ise o sayı asaldır
	 * Örn: 27  karekök =(5,...)  bölenlerimiz : 2,3,4,5 olacaktır.
	 * 3 e bölündüğü için işlemi sonlandır 28 e geç ;))
	 * 
	 */
 
	protected int asalBul(double maxDeger) {
 
		Double kareKok = 0.0;
		int sayac = 0;
		boolean isAsal = true;
		;
		for (double i = 2; i <= maxDeger; i++) {
 
			kareKok = Math.sqrt(i);
			isAsal = true;
 
			for (double k = 2; k <= kareKok; k++) {
 
				if ((i / k) % 1 == 0) {
 
					isAsal = false;
					break;
				}
 
			}
 
			if (isAsal) {
				sayac++;
			}
 
		}
 
		return sayac;
 
	}
 
	/*
	 * Run etmiş olduğumuz thread burada çalışıyor
	 * 
	 * (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
 
	@Override
	public void run() {
 
		int sayac = 0;
		long t1,t2;
		try{
		t1=new Date().getTime();
		sayac = asalBul(Double.parseDouble(girisET.getText().toString()));
		t2=new Date().getTime();
		ekranaYaz(sayac,(t2-t1));
 
		}
		catch (Exception e) {
			e.printStackTrace();
			uyariVer();
 
		}
		finally {
 
			handler.sendEmptyMessage(0);
		}
 
 
 
	}
 
	/*
	 * 
	 * Handler
	 * Başlatmış olduğumuz progress dialoğu işlemlerimiz sonlandığı 
	 * için mesaj göndererek
	 * burada raftan kaldırıyoruz.
	 */
 
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			pd.dismiss();
		}
	};
 
 
	/*
	 * 
	 * UI Thread
	 * Not: Layouttaki görsel öğeler üzerinde
	 * herhangi bir işlem için kullanılmalıdır.
	 * ############################# DIKKAT ################# 
	 * Aksi taktirde sadece başlatılan thread üzerinde işlem
	 * yapılmaya çalışılırsa UI elemanları sadece main thread tarafından 
	 * yönetilebilir gibisinden
	 * hata ile karşılaşılır.
	 * 
	 */
	public void ekranaYaz(final int sayac, final long gecenSure) {
		runOnUiThread(new Runnable() {
 
			@Override
			public void run() {
 
				sonucTV.setText(String.valueOf(sayac));
				gecenSureTV.setText((int)(gecenSure/1000)+" Saniye, "+gecenSure%1000+" MilSaniye");
 
			}
		});
	}
 
	public void uyariVer() {
		runOnUiThread(new Runnable() {
 
			@Override
			public void run() {
 
				Toast.makeText(getApplicationContext(), "OOPS ! Bir hata oluştu sakin ol, alanı boş bırakmamayı dene ! :)",Toast.LENGTH_LONG).show();
			}
		});
	}
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
 
    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal" >
 
        <requestFocus />
    </EditText>
 
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dip"
        android:text="Hesapla" />
 
    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="15dip"
        android:text="Asal Sayı Adedi"
        android:textAppearance="?android:attr/textAppearanceMedium" />
 
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dip"
        android:text="0"
        android:textAppearance="?android:attr/textAppearanceMedium" />
 
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="15dip"
        android:text="Geçen Süre :"
        android:textAppearance="?android:attr/textAppearanceMedium" />
 
    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dip"
        android:text="____"
        android:textAppearance="?android:attr/textAppearanceMedium" />
 
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="tugrulasik.com.egitimler.progressdialog"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk android:minSdkVersion="10" />
 
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".ProgressDialogveThreadActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>

Okuduğunuz için teşekkürler, yeni paylaşımlarımda görüşmek üzere 🙂

Kaynakça:
Android Developer
nurtenmehmedblog
Wikipedia
HelloAndroid


5 Comments

  1. Pretty nice post. I just stumbled upon your weblog and wished to say that I have really enjoyed surfing around your blog posts. After all I’ll be subscribing to your feed and I hope you write again very soon!

    1. Thanks a lot:)
      I am going to send 3 or 4 posts about android in this week :))

  2. I was suggested this blog by my cousin. I’m not sure whether this post is written by him as nobody else know such detailed about my trouble. You’re amazing! Thanks! your article about Android Thread, UI Thread ve ProgressDialog Kullanımı
    Best Regards Rolf

  3. I was recommended this web site by my cousin. I’m not sure whether this post is written by him as no one else know such detailed about my trouble. You are incredible! Thanks!
    Best Regards Cindy

Comments are closed.