Bugün Android “Volley” kütüphanesi ile bir sunucuya veri yollayarak gelen veriyi parçalama işlemine bakacağız. Bu işlemi kütüphane kullanmadan “AsyncTask” üzerinde de yapmak mümkün ancak işleri daha kolaylaştırmak adına popüler kütüphanelerden olan “Volley” ile yapacağız. Bunun için imdb üzerinden en çok izlenen 5 filmi alarak küçük bir web servis kısmını yazdım. Tabi siz web tarafında veri tabanı ile işlemler yaparak farklılaştırmanız mümkün. Bunun için öncelikle Php kodlarını ekleyeyim. Test etmek isterseniz alt tarafta Java içerisinde Url adresi ile kullanabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php function init(){ $films = array(); $films[0] = array("id"=> 1, "rank"=>1, "name"=>"The Shawshank Redemption", "year"=>1994, "rating"=>9.2); $films[1] = array("id"=> 2, "rank"=>2, "name"=>"The Godfather", "year"=>1972, "rating"=>9.2); $films[2] = array("id"=> 3, "rank"=>3, "name"=>"The Godfather: Part II", "year"=>1974, "rating"=>9.0); $films[3] = array("id"=> 4, "rank"=>4, "name"=>"The Dark Knight", "year"=>2008, "rating"=>8.9); $films[4] = array("id"=> 5, "rank"=>5, "name"=>"12 Angry Men", "year"=>1957, "rating"=>8.9); return $films; } function getFilms($id) { $films = init(); return $films[$id-1]; } ?> |
1 2 3 4 |
<?php require_once 'functions.php'; echo json_encode(init()); ?> |
1 2 3 4 5 6 7 8 9 |
<?php require_once 'functions.php'; if(isset($_POST['id'])){ $films = array(); $films[0] = getFilms($_POST['id']); echo json_encode($films); } ?> |
Buradan sonra artık Android Studio üzerinden devam edelim. Öncelikle “app->Gradle” içerisine kütüphaneyi ekleyelim.
1 |
compile 'com.mcxiaoke.volley:library:1.0.19' |
Şimdi “Applications” sınıfını “extends” ettiğimiz bir sınıf yapısına “Volley” için gerekli olan metotları ekleyelim. Bunun için “AppController.java” adında bir sınıf oluşturdum.
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 |
package com.KemalBakacak.VolleyExample; import android.app.Application; import android.text.TextUtils; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.toolbox.Volley; public class AppController extends Application { public static final String TAG = AppController.class.getSimpleName(); private RequestQueue mRequestQueue; private static AppController mInstance; @Override public void onCreate() { super.onCreate(); mInstance = this; } public static synchronized AppController getInstance() { return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(getApplicationContext()); } return mRequestQueue; } public <T> void addToRequestQueue(Request<T> req, String tag) { req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); getRequestQueue().add(req); } public <T> void addToRequestQueue(Request<T> req) { req.setTag(TAG); getRequestQueue().add(req); } public void cancelPendingRequests(Object tag) { if (mRequestQueue != null) { mRequestQueue.cancelAll(tag); } } } |
Sonra “AndroidManifest.xml” içerisinde izinleri ve “Application” altına bu sınıfı ekleyelim. “Application” altında “name” olarak ekliyoruz. Ek olarak birde internet izini alıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.KemalBakacak.VolleyExample"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" android:name=".AppController"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> </manifest> |
Ardından “MainActivity.java” üzerinden devam edelim. Burada “Volley” içerisinde “StringRequest” yapısını kullanacağız. Ama bundan önce “MainActivity” içerisine Url yapılarını ekleyelim.
1 2 3 4 |
private String TAG = "MainActivity"; private String URL = "http://www.kemalbakacak.com/blog-test-api/"; private String ALL_DATA_URL = URL + "all-data.php"; private String SELECTED_DATA_URL = URL + "selected-data.php"; |
Artık bir metot içerisinde “StringRequest” kullanalım. En sade yapısı aşağıda ki gibi oluyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
StringRequest sr = new StringRequest(Request.Method.POST, ALL_DATA_URL, new Response.Listener<String>() { @Override public void onResponse(String response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); } }); AppController.getInstance().addToRequestQueue(sr); |
Eğer başarılı olur ise “onResponse” içerisine girecek. Her hangi bir hata olur ise “onErrorResponse” içerisine girecek.
“onResponse” metodu içerisinde “parseJson” adında bir metot yazarak onu çağıralım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private void parseJson(String json) { JSONArray jsonArray = null; try { jsonArray = new JSONArray(json); JSONObject jsonObject; for(int i = 0; i < jsonArray.length(); i++){ jsonObject = jsonArray.getJSONObject(i); Log.d(TAG, "Rank : " + jsonObject.getInt("rank")); Log.d(TAG, "Name : " + jsonObject.getString("name")); Log.d(TAG, "Year : " + jsonObject.getInt("year")); Log.d(TAG, "Rating : " + jsonObject.getDouble("rating")); Log.d(TAG, "---------"); } } catch (JSONException e) { e.printStackTrace(); } } |
Daha sonra çalıştıralım.
Şimdi, eğer servise giderken içerisine her hangi bir veri eklemek istersek bunun için “Volley” tarafından “getParams” metodu bulunuyor. Bunu kullanarak içerisine “id” değeri ekleyelim. Bu metot bir “Map” olarak geri dönüş değeri bulunuyor.
1 2 3 4 5 |
@Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); return params; } |
Bununla birlikte metotu yazalım.
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 |
private void getSelectedData(final int id) { StringRequest sr = new StringRequest(Request.Method.POST, ALL_DATA_URL, new Response.Listener<String>() { @Override public void onResponse(String response) { parseJson(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); } }) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("id", "" + id); return params; } }; AppController.getInstance().addToRequestQueue(sr); } |
Son olarak “MainActivity.java” içerisindeki tüm kodları ekleyeyim.
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
package com.KemalBakacak.VolleyExample; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import com.android.volley.NetworkResponse; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.VolleyLog; import com.android.volley.toolbox.StringRequest; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; public class MainActivity extends AppCompatActivity { private String TAG = "MainActivity"; private String URL = "http://www.kemalbakacak.com/blog-test-api/"; private String ALL_DATA_URL = URL + "all-data.php"; private String SELECTED_DATA_URL = URL + "selected-data.php"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //getAllData(); getSelectedData(2); } private void getAllData() { StringRequest sr = new StringRequest(Request.Method.POST, ALL_DATA_URL, new Response.Listener<String>() { @Override public void onResponse(String response) { parseJson(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); } }); AppController.getInstance().addToRequestQueue(sr); } private void getSelectedData(final int id) { StringRequest sr = new StringRequest(Request.Method.POST, SELECTED_DATA_URL, new Response.Listener<String>() { @Override public void onResponse(String response) { parseJson(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); } }) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("id", "" + id); return params; } }; AppController.getInstance().addToRequestQueue(sr); } private void parseJson(String json) { JSONArray jsonArray = null; try { jsonArray = new JSONArray(json); JSONObject jsonObject; for(int i = 0; i < jsonArray.length(); i++){ jsonObject = jsonArray.getJSONObject(i); Log.d(TAG, "Rank : " + jsonObject.getInt("rank")); Log.d(TAG, "Name : " + jsonObject.getString("name")); Log.d(TAG, "Year : " + jsonObject.getInt("year")); Log.d(TAG, "Rating : " + jsonObject.getDouble("rating")); Log.d(TAG, "---------"); } } catch (JSONException e) { e.printStackTrace(); } } } |
Teşekkürler, görüşmek üzere.