Android Http Post ve AsyncTask Kullanımı

Merhaba arkadaşlar. Bu dersimizde Android de Post işlemi nasıl yapılır ,Post ile nasıl variable gönderilir ve Asynctask sınıfı nasıl kullanılır onu öğreneceğiz.

AsyncTask  sınıfını kısaca açıklıyacak olursak kullanıcı uygulamayı kullanırken arka planda kullanıcıya çaktırmadan gerekli işlemleri yapmaya yarar.Fazla uzatmadan kodlara geçelim.

[wpdm_file id=1]
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	Button buton;
	ProgressDialog pDialog;
	String url = "http://www.mobilhanem.com/test/deneme.php";
	String veri_string;
	PostClass post = new PostClass();  //Post Class dan post adında nesne olusturduk.Post classın içindeki methodu kullanabilmek için
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		buton = (Button)findViewById(R.id.button1);
		buton.setOnClickListener(new View.OnClickListener() { //buton a click listener ekledik

			public void onClick(View v) {
				new Post().execute(); //Asynctask Classı Çağırıyoruz
			}
		});

	}

	class Post extends AsyncTask<Void, Void, Void> {

		protected void onPreExecute() { // Post tan önce yapılacak işlemler. Yükleniyor yazısını(ProgressDialog) gösterdik.
 	        pDialog = new ProgressDialog(MainActivity.this);
	        pDialog.setMessage("Yükleniyor...");
	        pDialog.setIndeterminate(true);
	        pDialog.setCancelable(false); // ProgressDialog u iptal edilemez hale getirdik.
	        pDialog.show();
	    }

	    protected Void doInBackground(Void... unused) { // Arka Planda yapılacaklar. Yani Post işlemi

            List params = new ArrayList(); //Post edilecek değişkenleri ayarliyoruz.
            //Bu değişkenler bu uygulamada hiçbir işe yaramıyor.Sadece göstermek amaçlı
            params.add(new BasicNameValuePair("isim", "taha"));
    		params.add(new BasicNameValuePair("mail", "[email protected]"));

            veri_string = post.httpPost(url,"POST",params,20000); //PostClass daki httpPost metodunu çağırdık.Gelen string değerini aldık

            Log.d("HTTP POST CEVAP:",""+veri_string);// gelen veriyi log tuttuk

            return null;
	    }

	    protected void onPostExecute(Void unused) { //Posttan sonra
	    	pDialog.dismiss();  //ProgresDialog u kapatıyoruz.
	    	Toast.makeText(getApplicationContext(),veri_string, Toast.LENGTH_LONG).show(); //Gelen veriyi Toast meaj ile 3 sn boyunca gösterdik
	    }
	}

}

Burada Post işlemini PostClass ın içindeki httpPost metoduyla yaptık. Aslında bu uygulamada method kullanmaya gerek yoktu. Direk olarak da post işlemleri yapabilirdik ama büyük bir projede bu kodu sürekli yazıp tekrar edeceğimize bir method yazıp çağırmak daha mantıklı.

Şimdide httpPost methoduna bakalım

public  String httpPost(String url, String method,List params,int time) {

        //url: post yapılacak adres
		//method: post mu get mi
		//params:post edilecek veriler değişkenler
		//time: sunucudan cevap gelmezse kaç sn sonra uygulama donmadan postun iptal edileceği
        try {

            if (method == "POST") {

            	HttpParams httpParameters = new BasicHttpParams();
            	int timeout1 = time;
            	int timeout2 = time;
            	HttpConnectionParams.setConnectionTimeout(httpParameters, timeout1);
            	HttpConnectionParams.setSoTimeout(httpParameters, timeout2);
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                veri =  httpEntity.getContent();

            } else if (method == "GET") {

                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                veri =  httpEntity.getContent();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    veri, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            veri.close();
            veri_string = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Hata " + e.toString());
                 }

        return veri_string; // Aldığımız cevabın string halini geri dönüyoruz

    }

Burda unutmamamız gereken nokta ise AndroidManifest te internet bağlantısı için gerekli olan izini vermek.

<uses-permission android:name="android.permission.INTERNET" />

Post ettiğimiz sunucudaki php dosyası ise şöyle:

<?php
sleep(3); // Yükleniyor yazısının daha uzun gözükmesi için
echo "mobilhanem.com Http Post + Asynctask Dersi";
?>

Arkadaşlar kod üzerinde gerekli açıklamaları yapmaya çalıştım. Anlamadığınız yada takıldığınız bir yer olursa sorabilirsiniz.

Bir dahaki derste Android de JSON okumayı anlatmaya çalışacağım.O zamana kadar kendinize iyi bakın:)

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

[wpdm_file id=1] 13

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

36 Yorum

  • Merhaba taha bey,

    veri_string değerini herhangi bir stringle karşılaştırma yaptığımızda cevap olumsuz oluyor nedenini bulamadım.

    örnek:
    string deneme = “cevap” // veri_string in döndürdüğü değerle aynı
    string test =”ABC”
    if(deneme.equals(veri_string)){
    Toast.makeText(getApplicationContext(),test, Toast.LENGTH_LONG).show(); //
    }

    • deneme.equals(veri_string) ancak deneme stringiniz ile veri_string değeriniz eşitse true döner. veri_string değerini log luyoruz. Log cat ten değerine bakabilirsiniz. Yada direk ekrana AlertDiaologbox ile veri_string değerini bastırıp gelen veriyi görebilirisiniz.

      • İlgin için teşekkür ederim. Sorunu buldum.

        Dikkat edersen post.class dosyasında veri_string sonuna “n” ilave edilmiş. buda bir alt satıra geçirdiği için gözükmüyordu. Karşılaştırmaya bunu ekleyince düzeldi.

        if ((deneme1 + “n”).equals(veri_string)){

        Toast.makeText(getApplicationContext(),”LED KAPALI”, Toast.LENGTH_LONG).show();
        }
        iyi çalışmalar…

        • Teşekkür ederim. Takildiginiz yer olursa sorabilirsnz.Elimden geldigince yardim ederim.

  • üstad ben bi kaç veriyi hostumda bulunan php dosyasına göndermek ve kodları çalıştırmak istiyorum verdiğiniz örneğe göre bişeyler yaptım yalnız veri iletilmedi bende sizin kaynak kodu olduğu gibi kopyaladım ve php yide kopyaladım herşey aynı fakat butona tıkladığımda veriyi çekemedim sizin adresteki php ye yönlendirince çalışıyor ama çıkamadım bi türlü şu işin içinden

          • gerçek sunucudan çalıştırıyorum karacalarmuhendislik.com/satis.php

          • Taha hocam doğru söylemiş… Ben çalıştırdım.. Belki problemi çözmüş olabilirsiniz ama başka arkadaşlar için paylaşıyorum :

            Bazı modemlerde “loopback” denilen bir problem var… Yani; bu şu demek, aynı ağ üzerinden kendi sitenize ulaşamıyorsunuz… Bu nedenle; başka bir ağ üzerinden (ben client için mobil denedim) deneyin.. Şöyle ki; ben aynı ağda olduğu için; emulator üzerinde test edemiyorum.. Çünkü loopback problemi var… Hemen, apk’yı mobil cihaza indiriyorum ve (en önemlisi!!!) mobil ağ üzerinden uygulamayı çalıştırıyor ve “loopback” probleminden sıyrılıyorum.. Keşke olmasaydı tabii böyle bir problem 🙂

          • Üzerinden çok zaman geçmiş fakat benim de uygulamayı telefonda çalıştıramama problemim var.Emulatorde çalışıyor fakat telefonda çalışmıyor (php mysql baglantisi)
            Nasıl düzeltebilirim acaba

  • Teşekkür ederim çok işime yaradı. yalnız bir sorum olacak bu konuda çok yeniyim. AsyncTask kısmını override edilmiş bir metod mu yoksa kendimiz mi tanımladık? yani sdk kütüphanelerinde var mı yoksa sizin tanımladığınız fonksiyonlar mı?

    • Burdaki Asynctask bir method değil bir classdır.
      import android.os.AsyncTask; bu kod ile projemize import ediyoruz.
      Post classımıza extend ediyoruz ve artık Post Class ımızda Asnctask classın methodlarını kullanabiliyoruz.Yani sorunun cevabı AsyncTask bir method değil bir classdır.

  • Merhaba, öncelikle teşekkürler. Post çalışmıyor null dönüyor fakat get olarak çalışıyor nedeni ne olabilir acaba?

      • Merhaba, direkt indirdiğim kodlarda önce import project şeklinde açtığımda karşıma çıkan 3 seçeneği de işaretleyip çalıştırdığımda sizin php dosyanızın içeriği toast mesajı olarak geliyor, fakat php dosyasını kendi server’ıma atıp çalıştırdığımda sleep metodunda hata aldım bu hosting ile alakalı olduğundan sleep metodunu silerek denediğimde toast mesajı boş gözüküyor. Sleep metodu ile ilgili olduğunu zannetmediğim halde farklı bir hostingde sleep ile birlikte denedim yine aynı şekilde toast mesaj içeriği boş geliyor. Anlayamadım. sakıncası yoksa php url ‘lerini yazabilir miyim?

  • MerhAba iyi günler.
    Bu yönetemi başarıylaçalıştırdım. kodlrın bunların aynısı ama burdan mı aldım başka yerdenmi yoksa karmamaı yaptım bilmiyorum. Neyse neticede. TEXT içerikli mesajı sunucuya gönderip çekebiliyorum.
    SORUM ŞU: Acaba Resim, Ses(aac), video vb file içerikli dosyaları nasıl sunucuya gönderip alabileceğiz. Gerçi resimi almayı yapıyorum. Amahepböyle farklı farklımı olucak.tek bir noktadan olmuyormu bu tümgönderme alma işlemleri hepsi için ayrı ayrı sayfalarca kod yazmam şartmı yani ?

  • merhaba,
    Bu kodları başarıyla çalıştırdım fakat şöyle bir sorun var. httpPost metodunu çağırırken time değerini 2000 verip sunucudaki php dosyasına sleep(5) koyduğum zaman uygulama patlıyor. Acaba timeOut durumunda bir alertDialog ya da Toast mesajı nasıl gösterebiliriz?

  • public String httpPost(String url, String method,List params,int time) {

    if (method == “POST”) {
    HttpParams httpParameters = new BasicHttpParams();
    …….
    }
    httpPost methodunu yazarken HttpParams classını görmüyor Android Studio. Nedeni nedir acaba?
    DefaultHttpClient classındada aynı sorun var. Http ile ilgili işlemlerde sıkıntı yaşanıyor?

    • android{
      useLibrary ‘org.apache.http.legacy’
      }
      Gradle içine adroid tagının altına yukarıdaki gibi
      useLibrary ‘org.apache.http.legacy’
      Ekleyip sync etmeyi dener misin?

  • Öncelikle çok teşekkür ediyorum, çok faydalı bir paylaşım. Program bu şekliyle çalışıyor. Fakat ben veritabanına alacağım veriler manuel olarak değil, editlerden gelsin istiyorum.

    Ama parametre olarak almama izin vermedi. örn: “taha” yazmayıp etUsername.getText().toString() yazdığımda editleri göremiyor.

    doInBackground metodu içerisinde bu editleri görebilmesi için ne yapmalıyım?

  • http get metoduyla gönderdiğimiz Linkler, Sniffer Programlarıyla “HTTP 200 OK” mesajları altında görünüyor.
    bunları gizlemenin yada bu mesajları kapatmanın bir yolu var mıdır ?

  • İyi günler, burada asenkron görevin sonucunda veri_string değişkenine değer atanıyor, bu asenkron görev sonucu döndürmek için bağlantı sebebiyle biraz geç sonucu döndürebiliyor. eğer asenkron görevden hemen sonra veri_string adlı değişeni kullanmaya kalkarsak muhtemelen yeni değer gelmeden eski değerini döndürecek. Çünkü asenkron görevler yeni proses gibi davranıyorlar ve ana proses o prosesin sonucunu beklemeden işlemine devam edecek. acaba veri_string değişkenine asenkron task sonucunda dönen değer atandıktan sonra kullanmamız için nasıl bir yöntem izlememiz gerekiyor? şimdiden teşekkürler.

    • veri_string’e değer doInBackgorund methodunda atanıyor. Siz işlemlerinizi onPostExecute methodunda yaparsanız o zaten doInBackground methodu işini bitirdiği zaman çağırılıyor.

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?