<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>android volley json parse arşivleri - Mehmet Kirazlı</title>
	<atom:link href="https://www.mehmetkirazli.com/tag/android-volley-json-parse/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.mehmetkirazli.com/tag/android-volley-json-parse/</link>
	<description>Yazılımcı Notları</description>
	<lastBuildDate>Wed, 06 Feb 2019 08:30:02 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.10</generator>

<image>
	<url>https://www.mehmetkirazli.com/wp-content/uploads/2018/04/mehmetkirazlilogo.png</url>
	<title>android volley json parse arşivleri - Mehmet Kirazlı</title>
	<link>https://www.mehmetkirazli.com/tag/android-volley-json-parse/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Android Volley Kullanımı ve JSON Parse İşlemleri</title>
		<link>https://www.mehmetkirazli.com/android-volley-kullanimi-ve-json-parse-islemleri/</link>
					<comments>https://www.mehmetkirazli.com/android-volley-kullanimi-ve-json-parse-islemleri/#comments</comments>
		
		<dc:creator><![CDATA[Mehmet Kirazlı]]></dc:creator>
		<pubDate>Wed, 06 Feb 2019 07:39:06 +0000</pubDate>
				<category><![CDATA[Kütüphaneler]]></category>
		<category><![CDATA[android volley]]></category>
		<category><![CDATA[android volley json parse]]></category>
		<category><![CDATA[android volley kullanımı]]></category>
		<category><![CDATA[volley example]]></category>
		<category><![CDATA[volley get post işlemleri]]></category>
		<category><![CDATA[volley kütüphanesi]]></category>
		<guid isPermaLink="false">https://www.mehmetkirazli.com/?p=3153</guid>

					<description><![CDATA[<p>Volley, Android uygulamalarımızda kullandığımız AsyncTask&#8217;ın alternatifi olarak ortaya çıkarılan, Google I/O 2013 sunumunda duyurulan bir Network(Http) kütüphanesidir. Volley kütüphanesi, hazırladığınız bir REST servisi ya da JSON dosyası varsa, servis URL&#8217;ine bağlanıp sonucu size daha hızlı bir şekilde döndürür. AsyncTask kullananlar bilir. doInBackground() metodunda ekran işlemleri yapılmazdı ve tasklar bazen diğerinden önce çalışırdı. Activity bittikten sonra &#8230;</p>
<p>The post <a rel="nofollow" href="https://www.mehmetkirazli.com/android-volley-kullanimi-ve-json-parse-islemleri/">Android Volley Kullanımı ve JSON Parse İşlemleri</a> appeared first on <a rel="nofollow" href="https://www.mehmetkirazli.com">Mehmet Kirazlı</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Volley, Android uygulamalarımızda kullandığımız AsyncTask&#8217;ın alternatifi olarak ortaya çıkarılan, Google I/O 2013 sunumunda duyurulan bir Network(Http) kütüphanesidir.</p>



<span id="more-3153"></span>



<p>Volley kütüphanesi, hazırladığınız bir REST servisi ya da JSON dosyası varsa, servis URL&#8217;ine bağlanıp sonucu size daha hızlı bir şekilde döndürür. <strong>AsyncTask </strong>kullananlar bilir. <strong>doInBackground() </strong>metodunda ekran işlemleri yapılmazdı ve tasklar bazen diğerinden önce çalışırdı. Activity bittikten sonra AsyncTask kapatılırsa hata alınırdı. Volley ile bu sorunlar ortadan kalkmış oldu. Tüm işlemler asenkron olarak yapıldığı için zaten bu işi yapan AsyncTask&#8217;lara da gerek kalmadı.</p>



<p class="has-text-color has-vivid-red-color">Volley kütüphanesi, performansı arttırmak için en önemli işlev olarak <strong>önbellekleme </strong>özelliğini kullanır. Eğer bilgi Cache&#8217;de varsa doğrudan sonuç gösterilir. Yoksa yeni bir istek oluşturulur.</p>



<p class="has-medium-font-size"><strong>Volley kütüphanesinin avantajları :</strong></p>



<ul><li>Ağ isteklerinin zamanlamasını otomatik olarak yapar.</li><li>Cache yapısı olduğundan hızlı işlem yapar. Özellikle resim indirme ve gösterme işlemlerinde disk ya da bellekte cache&#8217;leme yapılır.</li><li>Eş zamanlı olarak çoklu bağlantıya izin verir.</li><li>İstekleri asenkron olarak işleyebildiği için AsyncTask&#8217;taki sorunlar görülmez.</li><li> AsyncTask&#8217;taki gibi karışık ve zorlu kontrollere gerek yoktur.</li><li>JSON ve resim işlemlerinde güçlü desteği mevcuttur.</li><li> Yapılan bir istek, istenildiğinde iptal edilebilir. İşi biten istekler otomatik olarak iptal edilir. </li><li>Büyük boyuttaki veri çekme işlemleri için uygun değildir. Cache sistemi yüksek boyutta veri tutmaya yetmeyecektir.</li></ul>



<p class="has-medium-font-size"><strong>RequestQueue Sınıfı</strong></p>



<p>Volley bünyesindeki <strong>RequestQueue </strong>sınıfı, önbelleğe yazma ve önbellekten okuma işlemlerini, istekleri sıraya koyma ve istek sonuçlarını dönme gibi işlemleri yapar. Her ağ isteğinden önce, bu sınıftan bir nesne oluşturulması ve daha sonrasında istenilen bağlantının sağlanması gerekir. Yapılan her isteğin, istekten sonra bu nesneye <strong>add()</strong> ile eklenmesi gerekir. Böylece istek kuyruğuna isteği eklemiş oluruz ve bu sınıf bizim için kuyruktaki isteklerin yönetimini ve cache&#8217;lemelerini yapar. AsyncTask&#8217;a göre en önemli avantajı budur.</p>



<p class="has-text-color has-vivid-red-color">Her activity için <strong>RequestQueue </strong>sınıfından nesne oluşturmak yerine, tüm uygulama boyunca tek bir <strong>Singleton </strong>nesne oluşturup, onun üzerinden kuyruğa ekleme ve çıkarma işlemleri yapılması <strong>Google </strong>tarafından öneriliyor. Biz uygulamalarımızda Singleton nesne kullanacağız fakat manuel olarak RequestQueue nesnesi oluşturmayı da bilelim. Konunun sonunda <strong>UYARI </strong>başlığı altında bunun detayları anlatılacaktır.</p>



<p style="font-size:32px"><strong>Yeni Proje Oluşturma</strong></p>



<p><strong>Volley </strong>hakkında bilgi verdikten sonra ufaktan proje oluşturalım ve Volley kullanımını görelim. </p>



<p>Proje oluşturduktan sonra ilk olarak <strong>build.gradle</strong> dosyasında <strong>Volley </strong>kütüphanesini tanıtıyoruz. Kütüphane ilk çıktığında <strong>jar </strong>oluşturma işlemini manuel olarak yapıyorduk. Sağolsun <strong>maven </strong>imdadımıza yetişti.</p>



<pre class="crayon-plain-tag">dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.volley:volley:1.1.0' // volley için bu satır eklenmeli
}</pre>



<p><strong>build.gradle</strong> dosyasının tamamı ise şu şekilde olacaktır.</p>



<pre class="crayon-plain-tag">apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.mehmetkirazli.volleykullanimi"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.volley:volley:1.1.0' // volley için bu satır eklenmeli
}</pre>



<p>Şimdi ise<strong> AppController</strong> sınıfını ekleyelim. Bu sınıf, tüm uygulama boyunca isteklerin takibini ve <strong>asenkron </strong>çalışmasını sağlar.</p>



<p><strong>Activity </strong>tabanlı değil de <strong>Application </strong>tabanlı bu sınıfı kullanmak, uygulamanın yaşam döngüsü boyunca yönetimin tek bir sınıftan ve tek bir <strong>RequestQueue </strong>nesnesi üzerinden olması amacıyla daha avantajlıdır. Bu şekilde sınıfı yazıp <strong>Manifest </strong>içinden de tanımını yapacağız.</p>



<p><strong>AsyncTask </strong>kullanırken <strong>cihaz döndürüldüğünde,&nbsp;</strong>Activity tekrar çalıştığı için <strong>AsyncTask </strong>da tekrar başlatılıyordu. Volley&#8217;de ise <strong>Application </strong>sınıfından türetilen <strong>AppController</strong> sınıfı üzerinden, yaşam döngüsü boyunca kuyruğa ekleme çıkarma işlemleri yapılır. Konu başında bundan bahsetmiştik.</p>



<pre class="crayon-plain-tag">package com.mehmetkirazli.volleykullanimi;

import android.app.Application;
import android.text.TextUtils;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
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;
    private ImageLoader mImageLoader;

    @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;
    }

    // kuyruya istek eklemek için kullanılır (istek adıyla beraber)
    public &lt;T> void addToRequestQueue(Request&lt;T> request, String tag) {
        request.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(request);
    }

    // kuyruya istek eklemek için kullanılır (istek adı olmadan)
    public &lt;T> void addToRequestQueue(Request&lt;T> request) {
        request.setTag(TAG);
        getRequestQueue().add(request);
    }

    // resimleri yükleme ve cache işlemleri için çağrılır
    public ImageLoader getImageLoader() {
        getRequestQueue();
        if (mImageLoader == null) {
            mImageLoader = new ImageLoader(this.mRequestQueue,
                    new BitMapCache());
        }
        return this.mImageLoader;
    }

    // volley isteğini iptal etmek için çağrılır
    public void cancelPendingRequests(Object obj) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(obj);
        }
    }
}</pre>



<p><strong>AppController </strong>sınıfı, <strong>Application </strong>sınıfından türetilir. Konunun sonunda resim indirme işlemi de yapacağımız için <strong>getImageLoader() </strong>metodunu da ekledik. Siz kullanmayacaksanız kaldırabilirsiniz.</p>



<p>Resim işlemleri için Cache&#8217;leme görevini yapacak olan <strong>BitMapCache </strong>sınıfımızı da ekleyelim. <strong>getImageLoader()&nbsp;</strong>metodunda bu sınıfı kullanıyoruz.</p>



<pre class="crayon-plain-tag">package com.mehmetkirazli.volleykullanimi;

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import com.android.volley.toolbox.ImageLoader;

public class BitMapCache extends LruCache&lt;String, Bitmap> implements ImageLoader.ImageCache {
    public static int getDefaultLruCacheSize() {
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        final int cacheSize = maxMemory / 8;

        return cacheSize;
    }

    public BitMapCache() {
        this(getDefaultLruCacheSize());
    }

    public BitMapCache(int sizeInKiloBytes) {
        super(sizeInKiloBytes);
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight() / 1024;
    }

    @Override
    public Bitmap getBitmap(String url) {
        return get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }
}</pre>



<p>Daha sonra <strong>AndroidManifest.xml</strong> dosyasında <strong>İnternet </strong>izni ekliyoruz. Uygulamada kullanacağımız 3 adet aktiviteyi tanımlıyoruz. Son olarak da <strong>application </strong>tag&#8217;inde <strong>name </strong>kısmında <strong>AppController</strong>&#8216;i tanımlıyoruz.</p>



<p class="has-text-color has-vivid-red-color">AppController kullanmayıp her istek için RequestQueue kullansaydık bu name tanımını yapmayacaktık.</p>



<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mehmetkirazli.volleykullanimi">

    &lt;uses-permission android:name="android.permission.INTERNET" />

    &lt;application
        android:name="com.mehmetkirazli.volleykullanimi.AppController"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        &lt;activity android:name=".ActivityMain">
            &lt;intent-filter>
                &lt;action android:name="android.intent.action.MAIN" />
                &lt;category android:name="android.intent.category.LAUNCHER" />
            &lt;/intent-filter>
        &lt;/activity>

        &lt;activity android:name=".ActivityMarkalar"/>
        &lt;activity android:name=".ActivityKullanicilar"/>
        &lt;activity android:name=".ActivityResimler"/>
    &lt;/application>

&lt;/manifest></pre>



<p style="font-size:32px"><br><strong>Giriş Ekranı</strong></p>



<p><strong>activity_main.xml</strong> dosyasına 3 adet buton ekleyelim. 1.sinde basit olarak <strong>JSON </strong>dosyasını okuyup listeye basalım. 2.sinde biraz daha karışık olan <strong>JSON </strong>dosyasını <strong>parse </strong>edip sonuçları bir listede gösterelim. Son butonda da <strong>Volley </strong>ile çekilen resimleri <strong>ImageView </strong>üzerinde gösterelim. </p>



<p>Bu işlemler yeni Activity üzerinde yapılacak o yüzden her bir buton için yeni bir Activity oluşturacağız ve her tıklamada yeni Activity açacağız.</p>



<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    &lt;Button
        android:id="@+id/btnMarka"
        android:layout_width="183dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="180dp"
        android:text="Markaları Göster" />
    
    &lt;Button
        android:id="@+id/btnKullanici"
        android:layout_width="183dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="230dp"
        android:text="Kullanıcıları Göster" />

    &lt;Button
        android:id="@+id/btnResim"
        android:layout_width="183dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="280dp"
        android:text="Resimleri Göster" />

&lt;/RelativeLayout></pre>



<figure class="wp-block-image"><a href="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/volleykullanimi1.png"><img decoding="async" loading="lazy" width="419" height="731" src="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/volleykullanimi1.png" alt="" class="wp-image-3154" srcset="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/volleykullanimi1.png 419w, https://www.mehmetkirazli.com/wp-content/uploads/2019/02/volleykullanimi1-172x300.png 172w" sizes="(max-width: 419px) 100vw, 419px" /></a></figure>



<p>Bu ekrana bağlı olan <strong>ActivityMain.java</strong> sınıfımız ise şu şekilde olacaktır.</p>



<pre class="crayon-plain-tag">package com.mehmetkirazli.volleykullanimi;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class ActivityMain extends AppCompatActivity {
    Button btnKullanici, btnMarka, btnResim;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnKullanici = (Button) findViewById(R.id.btnKullanici);
        btnMarka = (Button) findViewById(R.id.btnMarka);
        btnResim = (Button) findViewById(R.id.btnResim);

        btnMarka.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(getApplicationContext(), ActivityMarkalar.class));
            }
        });

        btnKullanici.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(getApplicationContext(), ActivityKullanicilar.class));
            }
        });

        btnResim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(getApplicationContext(), ActivityResimler.class));
            }
        });
    }
}</pre>



<p style="font-size:32px"><br><strong>Markalar Ekranı</strong></p>



<p>Buraya kadar <strong>Volley </strong>kullanarak bir <strong>Http </strong>isteği yapmadık. Bundan sonra istek gönderme işlemlerine başlıyoruz. İlk olarak elimizde markaları gösteren bir <strong>JSON </strong>dosyası olsun ve bu dosyayı çağırarak dönen sonucu bir listede gösterelim.</p>



<p>Önce <strong>markalar.json</strong> dosyasının içeriğini verelim sonra bunu <strong>Volley </strong>ile çağırıp dönen sonuçları <strong>Parse </strong>ederek gösterelim.</p>



<pre class="crayon-plain-tag">{
"markalar":[
    "Alfa Romeo",
    "Bmw",
    "Dacia",
    "Fiat",
    "Ford",
    "Honda",
    "Hyundai",
    "Jaguar",
    "Lada",
    "Mazda",
    "Mercedes",
    "Nissan",
    "Opel",
    "Peugeot",
    "Renault",
    "Seat",
    "Skoda",
    "Subaru",
    "Suzuki",
    "Tofaş",
    "Toyota",
    "Volkswagen",
    "Volvo"
    ]
}</pre>



<p>Şimdi <strong>ActivityMarkalar</strong> sınıfını kodlamaya başlayalım.</p>



<pre class="crayon-plain-tag">package com.mehmetkirazli.volleykullanimi;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class ActivityMarkalar extends AppCompatActivity {
    ListView listViewMarka;
    ProgressDialog dialog;
    String urlMarkalar = "https://www.mehmetkirazli.com/Dosya/markalar.json";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_markalar);

        listViewMarka = (ListView) findViewById(R.id.lwMarka);

        // istek bitene kadar dialog gösterilir. istek sonuçlanınca dialog kapatılacak
        dialog = new ProgressDialog(this);
        dialog.setMessage("Veriler Okunuyor...");
        dialog.setCancelable(false);
        dialog.show();

         /* StringRequest yerine JsonObjectRequest veya JsonArrayRequest de kullanılabilir.
         Fakat StringRequest hepsini kapsadığı için bunu kullandık. */
        // VOLLEY İSTEĞİ BURADA YAPILIYOR.
        StringRequest request = new StringRequest(Request.Method.GET, urlMarkalar, new Response.Listener&lt;String>() {
            @Override
            public void onResponse(String string) { // sonuç başarılı dönerse onResponse çağrılır
                okunanlariParseEt(string);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) { // hata olursa volleyError nesnesinde hata sebebi yazar
                Toast.makeText(getApplicationContext(), "Veriler Okunurken Hata Oluştu", Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }
        });

        // isteği kuyruğa ekledik. "markalar" etiketini ise isteği iptal etmek istediğimizde kullanacağız. Zorunlu değildir
        AppController.getInstance().addToRequestQueue(request, "markalar"); 
    }

    void okunanlariParseEt(String okunanJson) { // dönen sonucu parse ediyoruz
        try {
            JSONObject jsonObj = new JSONObject(okunanJson);
            JSONArray arrayMarka = jsonObj.getJSONArray("markalar");
            ArrayList&lt;String> sonucList = new ArrayList&lt;>();

            for (int i = 0; i &lt; arrayMarka.length(); ++i) { // markaları tek tek listeye ekledik
                sonucList.add(arrayMarka.getString(i));
            }

            // oluşturduğumuz sonucList listesini, listview'ın adaptörüne verdik ve listede gösterilmesini sağladık
            ArrayAdapter&lt;String> adapter = new ArrayAdapter&lt;>(this, android.R.layout.simple_list_item_1, sonucList);
            listViewMarka.setAdapter(adapter);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        dialog.dismiss();
    }
}</pre>



<p>Burada yapılan işlemleri açıklama satırlarında anlatmaya çalıştım. Yine üzerinden geçelim.</p>



<p>Bir <strong>StringRequest </strong>nesnesi oluşturduk. İlk parametresi, <strong>isteğin tipidir</strong>. Biz <strong>GET </strong>isteğinde bulunduk. Sonraki parametre, bağlanacağımız <strong>URL</strong>&#8216;dir. Diğer 2 parametre ise başarılı ve başarısız sonuç döndüğünde çalışacak <strong>Listener</strong>&#8216;lardır.</p>



<p>Sonuç dönerse <strong>onResponse()</strong> metodu çalışır. Bu metotta dönen <strong>JSON </strong>değeri <strong>parse </strong>edilir ve değerler tek tek listeye eklenir. Son olarak liste, <strong>ListView</strong>&#8216;a <strong>adaptör </strong>olarak verilir ve ekranda gösterilir.</p>



<p class="has-text-color has-vivid-red-color">Eğer dönen <strong>JSON </strong>değeri, doğrudan bir <strong>JSON Array</strong>&#8216;i ise <strong>StringRequest </strong>yerine <strong>JsonArrayRequest </strong>de kullanabilirsiniz. O zaman Listener&#8217;a ait metotlar da değişecektir. <strong>JSON Objesi </strong>ise <strong>JsonObjectRequest </strong>sınıfı kullanılabilir. <strong>StringRequest </strong>ikisini de kapsadığı için ben bunu kullandım.</p>



<p>Bu sınıfa ait<strong> xml </strong>dosyasını da oluşturalım.</p>



<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    &lt;ListView
        android:id="@+id/lwMarka"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
&lt;/RelativeLayout></pre>



<p><strong>Markaları Göster</strong> butonuna tıkladığımızda ekran görüntüsü şu şekilde olacaktır.</p>



<figure class="wp-block-image"><a href="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/VolleyKullanimi2.png"><img decoding="async" loading="lazy" width="344" height="587" src="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/VolleyKullanimi2.png" alt="" class="wp-image-3155" srcset="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/VolleyKullanimi2.png 344w, https://www.mehmetkirazli.com/wp-content/uploads/2019/02/VolleyKullanimi2-176x300.png 176w" sizes="(max-width: 344px) 100vw, 344px" /></a></figure>



<p style="font-size:32px"><br><strong>Kullanıcılar Ekranı</strong></p>



<p><strong>ActivityKullanicilar.java</strong> sınıfında ise biraz daha detaylı bir <strong>JSON </strong>dosyası okuyacağız ve parse edip ListView&#8217;da göstereceğiz.</p>



<p>Öncelikle URL&#8217;imizde bulunan <strong>JSON </strong>dosyasının içeriğini paylaşalım. JSON dosyasında şu bilgiler bulunmaktadır.</p>



<pre class="crayon-plain-tag">[{
  "id": 1,
  "ad": "Mehmet",
  "soyad": "Kirazli",
  "sehir": "Istanbul",
  "cinsiyet": "Erkek",
  "ip_adres": "36.48.233.2"
}, {
  "id": 2,
  "ad": "Faruk",
  "soyad": "Kalkan",
  "sehir": "Edirne",
  "cinsiyet": "Erkek",
  "ip_adres": "212.111.4.222"
}, {
  "id": 3,
  "ad": "Salih",
  "soyad": "Aydin",
  "sehir": "Samsun",
  "cinsiyet": "Erkek",
  "ip_adres": "120.33.112.111"
}, {
  "id": 4,
  "ad": "Okan",
  "soyad": "Eren",
  "sehir": "Giresun",
  "cinsiyet": "Erkek",
  "ip_adres": "77.77.222.11"
}]</pre>



<p>Şimdi bu <strong>JSON </strong>dosyasına <strong>Volley </strong>ile erişip okuma işlemi yapalım.</p>



<p class="has-text-color has-vivid-red-color">Şuan elimde JSON bilgisi dönen bir servis olmadığı için hazır bir JSON dosyasına erişiyorum. Eğer JSON dönen <strong>www.mehmetkirazli.com/apis/getusers.php</strong> gibi bir servis olsaydı, URL kısmında bunu yazacaktım. Fakat siz test amaçlı olarak :<br><strong>https://maps.googleapis.com/maps/api/place/textsearch/xml?query=restaurants+in+Sydney&amp;key=API_KEY&nbsp;</strong><br>URL&#8217;ini test edebilirsiniz. Api key girerek servisten dönen JSON değerini görebilirsiniz.</p>



<p><strong>ActivitiyKulanicilar.java</strong></p>



<pre class="crayon-plain-tag">package com.mehmetkirazli.volleykullanimi;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;

import org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;

public class ActivityKullanicilar extends AppCompatActivity {
    ListView listViewMarka;
    String urlKullanicilar = "https://www.mehmetkirazli.com/Dosya/kullanicilar.json";
    ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_kullanicilar);

        listViewMarka = (ListView) findViewById(R.id.lwMarka);

        // istek bitene kadar dilaog gösterilir. istek sonuçlanınca dialog kapatılacak
        dialog = new ProgressDialog(this);
        dialog.setMessage("Veriler Okunuyor...");
        dialog.setCancelable(false);
        dialog.show();

        /* StringRequest yerine JsonObjectRequest veya JsonArrayRequest de kullanılabilir.
         Fakat StringRequest hepsini kapsadığı için bunu kullandık. */
        // VOLLEY İSTEĞİ BURADA YAPILIYOR.
        StringRequest request = new StringRequest(Request.Method.GET, urlKullanicilar, new Response.Listener&lt;String>() {
            @Override
            public void onResponse(String sonuc) { // sonuç başarılı dönerse onResponse çağrılır
                ArrayList&lt;Kullanicilar> kullaniciList = okunanlariParseEt(sonuc); // parse metodu çağrıldı
                ArrayAdapter&lt;Kullanicilar> adapter = new ArrayAdapter&lt;>(ActivityKullanicilar.this, android.R.layout.simple_list_item_1, kullaniciList);
                listViewMarka.setAdapter(adapter);
            }
        }, new Response.ErrorListener() { // hata oluşursa burası çağrılır
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(getApplicationContext(), "Veriler Okunurken Hata Oluştu", Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }
        });

        AppController.getInstance().addToRequestQueue(request, "kullanicilar");
    }

    ArrayList&lt;Kullanicilar> okunanlariParseEt(String okunanJson) {
        ArrayList&lt;Kullanicilar> kullaniciList = new ArrayList&lt;>();
        try {
            JSONArray arrayKullanici = new JSONArray(okunanJson);
            for (int i = 0; i &lt; arrayKullanici.length(); ++i) {
                kullaniciList.add(new Kullanicilar(Integer.valueOf(arrayKullanici.getJSONObject(i).get("id").toString()), arrayKullanici.getJSONObject(i).get("ad").toString(),
                        arrayKullanici.getJSONObject(i).get("soyad").toString(), arrayKullanici.getJSONObject(i).get("sehir").toString(),
                        arrayKullanici.getJSONObject(i).get("cinsiyet").toString(), arrayKullanici.getJSONObject(i).get("ip_adres").toString()));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        dialog.dismiss();
        return kullaniciList;
    }
}</pre>



<p>Genel olarak <strong>Markalar </strong>sınıfındaki benzer işlemleri yaptık. Parse işlemleri biraz daha karışık oldu. <strong>AppController </strong>sınıfında <strong>addToRequestQueue()</strong> metoduna, isteğimizi parametre olarak verdik ve kuyruğa ekledik. Yanında bir de <strong>&#8220;kullanicilar&#8221; </strong>metnini verdik. Bunu, isteği iptal etmek istediğimizde kullanacağız ve bu isimle iptal edeceğiz. Bunu kendisi yapıyor fakat örnek olması açısından yazdım. Bu parametreyi yazmak zorunlu değildir.</p>



<p>Burada <strong>Markalar </strong>sınıfından farklı olarak, dönen JSON&#8217;ı parse edip <strong>Kullanicilar </strong>adında bir <strong>model </strong>sınıfına ekledik. <strong>Kullanicilar </strong>sınıfını da verelim.</p>



<p><strong>Kullanicilar Model sınıfı:</strong></p>



<pre class="crayon-plain-tag">package com.mehmetkirazli.volleykullanimi;

public class Kullanicilar {
    private int id;
    private String ad;
    private String soyad;
    private String sehir;
    private String cinsiyet;
    private String ip_adres;

    public Kullanicilar(int id, String ad, String soyad, String sehir, String cinsiyet, String ip_adres) {
        this.id = id;
        this.ad = ad;
        this.soyad = soyad;
        this.sehir = sehir;
        this.cinsiyet = cinsiyet;
        this.ip_adres = ip_adres;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAd() {
        return ad;
    }

    public void setAd(String ad) {
        this.ad = ad;
    }

    public String getSoyad() {
        return soyad;
    }

    public void setSoyad(String soyad) {
        this.soyad = soyad;
    }

    public String getSehir() {
        return sehir;
    }

    public void setSehir(String sehir) {
        this.sehir = sehir;
    }

    public String getCinsiyet() {
        return cinsiyet;
    }

    public void setCinsiyet(String cinsiyet) {
        this.cinsiyet = cinsiyet;
    }

    public String getIp_adres() {
        return ip_adres;
    }

    public void setIp_adres(String ip_adres) {
        this.ip_adres = ip_adres;
    }

    @Override
    public String toString() {
        return ad + " " + soyad + "\n" + cinsiyet + "-" + sehir + "-" + ip_adres;
    }
}</pre>



<p>Bu model sınıfında en son <strong>toString()</strong> metodunu <strong>override</strong> ettik. Çünkü ListView&#8217;a bu modele ait listeyi parametre olarak verdiğimizde, her satırda görülmesi istenen metni yazdık. <strong>Custom </strong>bir <strong>Adapter</strong>&#8216;e gerek kalmadı.</p>



<p><strong>activity_kullanicilar.xml</strong> dosyası :</p>



<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    &lt;ListView
        android:id="@+id/lwMarka"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
&lt;/RelativeLayout></pre>



<p><strong>&#8220;Kullanıcıları Göster&#8221;</strong> butonuna tıkladığımızda <strong>ActivityKullanicilar </strong>ekranı açılacak ve sonuç alınıp ekrana aşağıdaki gibi bilgiler yazılacak. Tabi bu arada <strong>ProgressBar </strong>da dönecek ve sonuç döndüğünde progress kapanacak.</p>



<figure class="wp-block-image"><a href="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/VolleyKullanimi3.png"><img decoding="async" loading="lazy" width="341" height="589" src="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/VolleyKullanimi3.png" alt="" class="wp-image-3156" srcset="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/VolleyKullanimi3.png 341w, https://www.mehmetkirazli.com/wp-content/uploads/2019/02/VolleyKullanimi3-174x300.png 174w" sizes="(max-width: 341px) 100vw, 341px" /></a></figure>



<p style="font-size:32px"><br><strong>POST İSTEĞİ GÖNDERME</strong></p>



<p>Bu zamana kadar örneklerde <strong>GET </strong>isteği gönderdik. <br></p>



<pre class="crayon-plain-tag">StringRequest request = new StringRequest(Request.Method.GET, urlKullanicilar, new Response.Listener&lt;String>() {</pre>



<p>Satırında da <strong>GET </strong>isteği gönderdiğimizi belirttik. Hazırladığınız servisin özelliğine göre <strong>POST </strong>isteği de göndermek isteyebilirsiniz. <strong>POST </strong>isteklerinde servise parametre gönderirsiniz ve size sonuç döner. <strong>URL </strong>kısmında ise gönderdiğiniz parametreler yazmaz. <strong>GET </strong>isteğinde ise bu parametreler yazar. Parametreden kastımız örnek olarak <strong>id = 1</strong> gönderirsiniz ve <strong>id </strong>değeri 1 olan kayıtlar serviste okunur ve sonuç <strong>JSON </strong>olarak size döner. </p>



<p class="has-text-color has-vivid-red-color">Yani GET işleminde URL&#8217;de parametreleri yazarız (Örneklerimizde parametre yoktu). POST işleminde ise parametreleri URL&#8217;e yazmayız, arkaplanda göndeririz.</p>



<p><strong>Volley </strong>ile <strong>POST </strong>isteği oluşturduğunuzda, her şey aynı sadece <strong>StringRequest</strong>&#8216;i oluşturduğunuz satırda aşağıdaki gibi ufak bir değişiklik yapıyorsunuz.</p>



<pre class="crayon-plain-tag">StringRequest request = new StringRequest(Request.Method.POST, urlKullanicilar, new Response.Listener&lt;String>() {</pre>



<p>Daha sonra da isteğin sonuna parametreleri ekliyorsunuz. Parametre ekleme metodu olan <strong>getParams()</strong> metodundaki süslü parantezlerin sırasına dikkat ediniz. Çünkü bu bölüm biraz karışık. Kod bloğumuz son olarak şu şekilde olur:</p>



<pre class="crayon-plain-tag">StringRequest request = new StringRequest(Request.Method.POST, urlKullanicilar, new Response.Listener&lt;String>() {
            @Override
            public void onResponse(String string) {
                ArrayList&lt;Kullanicilar> kullaniciList = okunanlariParseEt(string);
                ArrayAdapter&lt;Kullanicilar> adapter = new ArrayAdapter&lt;>(ActivityResimler.this, android.R.layout.simple_list_item_1, kullaniciList);
                listViewMarka.setAdapter(adapter);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(getApplicationContext(), "Veriler Okunurken Hata Oluştu", Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }
        }) {
            @Override
            protected Map&lt;String, String> getParams() {
                Map&lt;String, String> params = new HashMap&lt;>();
                params.put("id", "2");
                return params;
            }
        };

        AppController.getInstance().addToRequestQueue(request);</pre>



<p>Burada id değeri 2 ye eşit olan kaydı bize getirir. Tabi servisin de buna uygun kontrolleri yapmış olması gerekiyor. Örnek olarak eğer servisimiz PHP ile hazırlanmışsa şu şekilde kontrol olacaktır.</p>



<pre class="crayon-plain-tag">if($_SERVER['REQUEST_METHOD']=="POST"){
	$id= @$_POST['id'];
}</pre>



<p>Bunu <strong>GET </strong>ile yapsaydık <strong>urlKullanicilar </strong>URL&#8217;inin sonunda <strong>?id=2</strong> gibi bir ekleme yapılacaktı ve <strong>getParams() </strong>olmayacaktı.</p>



<p style="font-size:26px"><strong>Header Ekleme</strong></p>



<p>Eğer <strong>POST </strong>isteğinize bir <strong>Header </strong>bilgisi eklemek istiyorsanız, isteğinizi aşağıdaki gibi güncellemeniz gerekmektedir.</p>



<pre class="crayon-plain-tag">StringRequest request = new StringRequest(Request.Method.POST, urlKullanicilar, new Response.Listener&lt;String>() {
            @Override
            public void onResponse(String string) {
                ArrayList&lt;Kullanicilar> kullaniciList = okunanlariParseEt(string);
                ArrayAdapter&lt;Kullanicilar> adapter = new ArrayAdapter&lt;>(ActivityResimler.this, android.R.layout.simple_list_item_1, kullaniciList);
                listViewMarka.setAdapter(adapter);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(getApplicationContext(), "Veriler Okunurken Hata Oluştu", Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }
        }) {
            @Override
            public Map&lt;String, String> getHeaders() throws AuthFailureError {
                HashMap&lt;String, String> headers = new HashMap&lt;>();
                headers.put("Content-Type", "application/json");
                headers.put("apiKey", "abcdefghijklmn");
                return headers;
            }
        };</pre>



<p style="font-size:24px" class="has-text-color has-vivid-red-color"><br><strong>ÖNEMLİ BİR UYARI</strong><br></p>



<p>Konu başında belirtmiştim. <strong>Volley </strong>isteği oluşturduktan sonra isteği, <strong>AppController </strong>üzerinden kuyruğa ekliyoruz. Bu işlem şu şekilde de yapılabiliyor fakat önerilmiyor.</p>



<p><strong>İsteği oluşturmadan önce :</strong></p>



<pre class="crayon-plain-tag">RequestQueue rQueue = Volley.newRequestQueue(ActivityMarkalar.this);</pre>



<p>Kod bloğu ile bir kuyruk oluşturuluyor. İstek oluşturulduktan sonra da aşağıdaki gibi isteğimiz kuyruğa ekleniyor.</p>



<p><strong>İsteği oluşturduktan sonra :</strong></p>



<pre class="crayon-plain-tag">rQueue.add(request);</pre>



<p><strong>Eğer uygulamada çokça Volley isteği olacaksa</strong>, bu işlemlerin tek bir <strong>SingletonClass </strong>üzerinden yapılması (<strong>AppController</strong>) daha doğrudur ve Google da bunu önermektedir. Fakat az sayıda istek olması durumunda manuel olarak her istek için <strong>RequestQueue </strong>nesnesi de oluşturulabilir. Bu şekilde bir yapı kullanılacaksa, <strong>RequestQueue </strong>nesnesi, istek yapılmadan önce oluşturulmalıdır.</p>



<p style="font-size:32px"><strong>Resim İşlemleri</strong></p>



<p>Son olarak <strong>Volley </strong>ile resim bilgisini okuyup <strong>ImageView </strong>üzerinde gösterim işlemini yapalım. Okunan resim bilgisini <strong>Bitmap</strong>&#8216;e çevirip ImageView içerisine <strong>set </strong>edeceğiz.</p>



<p>İlk olarak xml tarafını yazalım. Basit bir <strong>ImageView </strong>olması yeterli. <strong>activity_resimler:</strong></p>



<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    &lt;ImageView
        android:id="@+id/imgView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true" />
&lt;/RelativeLayout></pre>



<p>Şimdi de <strong>ActivityResimler </strong>sınıfını kodlayalım.</p>



<pre class="crayon-plain-tag">package com.mehmetkirazli.volleykullanimi;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ImageView;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;

public class ActivityResimler extends AppCompatActivity {
    String urlResimler = "https://www.mehmetkirazli.com/wp-content/uploads/2017/03/islami-hafiza-oyunu-310x165.png";
    ProgressDialog dialog;
    ImageView imgView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_resimler);

        imgView = (ImageView) findViewById(R.id.imgView);

        dialog = new ProgressDialog(this);
        dialog.setMessage("Veriler Okunuyor...");
        dialog.setCancelable(false);
        dialog.show();

        ImageLoader imageLoader = AppController.getInstance().getImageLoader();
        // resim indirilirken ve hata olması durumunda gösterilecek resimleri ayarladık.
        imageLoader.get(urlResimler, ImageLoader.getImageListener(imgView, R.drawable.yukleniyor, R.drawable.hata));
        // resim alınıyor
        imageLoader.get(urlResimler, new ImageLoader.ImageListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                dialog.dismiss(); // hata olursa dialog kapansın ve hata mesajı loga basılsın
                Log.d("hata",error.toString());
            }

            @Override
            public void onResponse(ImageLoader.ImageContainer response, boolean arg1) {
                if (response.getBitmap() != null) {
                    imgView.setImageBitmap(response.getBitmap()); // bitmap'e çevirip set ettik
                }
                dialog.dismiss();
            }
        });
    }
}</pre>



<p>Burada resim indirilirken aşağıdaki <strong>YÜKLENİYOR </strong>resmi ImageView&#8217;da gösterilecek.</p>



<figure class="wp-block-image"><a href="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/yukleniyor.png"><img decoding="async" loading="lazy" width="200" height="200" src="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/yukleniyor.png" alt="" class="wp-image-3160" srcset="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/yukleniyor.png 200w, https://www.mehmetkirazli.com/wp-content/uploads/2019/02/yukleniyor-150x150.png 150w" sizes="(max-width: 200px) 100vw, 200px" /></a></figure>



<p>Eğer resim indirilirken hata alınırsa da ImageView&#8217;da aşağıdaki hata resmi gösterilecek. <strong>Volley </strong>ile bunları ayarlayabilmek iyi oluyor.</p>



<figure class="wp-block-image"><a href="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/hata.png"><img decoding="async" loading="lazy" width="200" height="200" src="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/hata.png" alt="" class="wp-image-3159" srcset="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/hata.png 200w, https://www.mehmetkirazli.com/wp-content/uploads/2019/02/hata-150x150.png 150w" sizes="(max-width: 200px) 100vw, 200px" /></a></figure>



<p>Ekran çıktımız ise şu şekilde olacaktır.</p>



<figure class="wp-block-image"><a href="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/volley4.png"><img decoding="async" loading="lazy" width="344" height="587" src="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/volley4.png" alt="" class="wp-image-3161" srcset="https://www.mehmetkirazli.com/wp-content/uploads/2019/02/volley4.png 344w, https://www.mehmetkirazli.com/wp-content/uploads/2019/02/volley4-176x300.png 176w" sizes="(max-width: 344px) 100vw, 344px" /></a></figure>



<p style="font-size:26px"><br><strong>Cache Okuma&nbsp;ve&nbsp;Silme</strong></p>



<p>Volley kütüphanesinde <strong>Cache </strong>mekanizması olduğunu ve bu yüzden hız konusunda avantaj sağladığını söylemiştik. Cache&#8217;de tutulan bilgileri görmek, eğer cache boşsa yeni bir istek yapmak isteyebiliriz. Bunun kullanımı ise şu şekildedir.</p>



<pre class="crayon-plain-tag">Cache cache = AppController.getInstance().getRequestQueue().getCache();
        Cache.Entry entry = cache.get("https://www.mehmetkirazli.com/Dosya/markalar.json");
        if (entry != null) {
            try {
                String cacheBilgisi = new String(entry.data, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        } else {
            // cache boş. yeni istek yapılabilir
        }</pre>



<p>Daha önce gidilmiş bir <strong>URL </strong>varsa, <strong>Cache</strong>&#8216;de tutulan dönüş bilgisini bu şekilde görebiliriz. Debug yapıldığında, <strong>cacheBilgisi </strong>değişkeninde, henüz istek yapılmadan JSON değeri görülür.</p>



<p>Url&#8217;deki <strong>JSON </strong>bilgisinin değiştiğini düşünürsek, <strong>Cache </strong>bilgisini silmek için ise aşağıdaki kod kullanılabilir.</p>



<pre class="crayon-plain-tag">AppController.getInstance().getRequestQueue().getCache().remove("https://www.mehmetkirazli.com/Dosya/markalar.json");</pre>



<p style="font-size:26px"><br><strong>İstek İptal Etme</strong></p>



<p>Örneklerde kuyruğa eklerken bir parametre daha eklemiştik hatırlarsanız. Bunu daha sonra istek iptal etmek istediğimizde <strong>KEY </strong>olarak kullanacağımızı söylemiştik.</p>



<p>Eğer kullanıcıları aldığımız isteği herhangi bir sebeple iptal etmek istersek:</p>



<pre class="crayon-plain-tag">AppController.getInstance().getRequestQueue().cancelAll("kullanicilar");</pre>



<p>Komutunu kullanmalıyız. <strong>Volley </strong>bunu bizim için yapıyor fakat bir yerde işleyişe müdahale etmek istediğimizde işimize yarayacaktır.</p>



<p>Volley kütüphanesinin kullanımı bu şekildedir. Uzun bir yazı oldu umarım anlatabilmişimdir. </p>



<p>Geliştiriciler için Volley bir nimettir. En azından AsyncTask belasından kurtulmuş olduk <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Görüşmek üzere&#8230;</p>



<p class="has-text-color has-medium-font-size has-vivid-red-color"><strong><a href="https://www.mehmetkirazli.com/KaynakKodlar/VolleyKullanimi.rar">KAYNAK KODLAR</a></strong></p>
<p>The post <a rel="nofollow" href="https://www.mehmetkirazli.com/android-volley-kullanimi-ve-json-parse-islemleri/">Android Volley Kullanımı ve JSON Parse İşlemleri</a> appeared first on <a rel="nofollow" href="https://www.mehmetkirazli.com">Mehmet Kirazlı</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mehmetkirazli.com/android-volley-kullanimi-ve-json-parse-islemleri/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
