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
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.
Mükemmel bir yazı olmuş bende bununla ilgili hemen bir yazı yazacağım . . .
Teşekkür ederim. Faydali olduysa ne mutlu:)
ü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
android manifeste internet iznini verdin mi?
tabiki verdim hostumla ilgili değildir değilmi
verdiğim izinler
localhost tan mı çalışıyorsun. Yoksa gerçek sunucudan mı?
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?
Çalışmıyor dediğiniz sizin kendi kodunuz mu? Burdaki projeyi indirip denediğinizde mi hata alıyorsunuz?
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?
Direk kendimiz kontrol etmiyoruz.Peki methodu Get yaptığınızda çalışıyor mu?
Evet, metodu get olarak değiştirince mesaj içeriği geliyor. Sorunun kaynağını çözebilmek için Logcat’den mi bakmalıyım acaba?
Link: http://ardagokbulut.com/android/httpPostAsyncTask.php
Kod içeriği
echo “ardagokbulut.com Http Post + Asynctask Dersi”;
Benimde aklımda bişi canlanmadı aklıma şu geliyor htaccess de farklı bir yönlendirme olabilir mi ?
Taha Bey, htAccess ‘i kontrol ettim fakat normal gözüküyor. Hiç htaccess olmayan bir url’de de çalıştıramadım. Sizden ricam sizdeki uygulama benim url üzerinden çalışıyor mu acaba kontrol etme imkanınız var mı?
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 ?
HTTP 200 Ok Demek serverdan cevabın başarıyla alındığı demektir.
PostClass’ları Tanımıyor Program Kırmızı Renk Atıyor Ne Yapmam gerek ?
[…] Bu methodda oluşmuş olan token’ı servisimize gönderme işlemlerini yapmalısınız. Bunu Asynctask , volley kütüphanesi veya Retrofit kütüphanelerini ile yapabilirsiniz. Bu yapıyı nasıl […]
İ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.
[…] anlatmıyorum. Bu konu hakkında detaylı bilgi ve örnek uygulamaları incelemk için buradaki ve buradaki derslerime bakabilirsiniz. Bu dersimde anlatmak istediklerim bu kadar. Anlamadığınız yerleri […]
PostClass’ları Tanımıyor Program Kırmızı Renk Atıyor Ne Yapmam lazım ?
Merhaba, kaynak kodu indirip incelediniz mi ? kod içinde kendimiz oluşturuyoruz o sınıfları