神刀安全网

Volley Demo in Android

Volley is an HTTP library that makes networking for Android apps easier and most importantly, faster. Volley is available through the open AOSP repository.

Volley offers the following benefits:
  • Automatic scheduling of network requests.
  • Multiple concurrent network connections.
  • Transparent disk and memory response caching with standard HTTP cache coherence.
  • Support for request prioritization.
  • Cancellation request API. You can cancel a single request, or you can set blocks or scopes of requests to cancel.
  • Ease of customization, for example, for retry and backoff.
  • Strong ordering that makes it easy to correctly populate your UI with data fetched asynchronously from the network.
  • Debugging and tracing tools.

Volley Demo in Android

Volley Demo in Android

First we need to download Volley framework as a library and add it to our project.

Clone the below url

git clone https://android.googlesource.com/platform/frameworks/volley

Now you will get a volley project downloaded.

I assume that you have created a Android Studio Project and opened it.Now from that Window, Click File Menu -> New -> Import Module and Select Volley project we just downloaded.

We can see a Module Name while importing. You need to use this name in the gradle file to add the Volley library to your project.

My gradle file is looking like this.

dependencies {      compile fileTree(dir: 'libs', include: ['*.jar'])     testCompile 'junit:junit:4.12'     compile 'com.android.support:appcompat-v7:23.2.1'     compile 'com.android.support:design:23.2.1'     compile 'com.google.code.gson:gson:1.7.2'     compile project(':volley')  }

Create a SingleTon class for handling Volley requests.

package com.coderzheaven.volleydemo;  import android.content.Context; import android.graphics.Bitmap; import android.support.v4.util.LruCache;  import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.Volley;  public class MySingleton {     private static MySingleton mInstance;     private RequestQueue mRequestQueue;     private ImageLoader mImageLoader;     private static Context mCtx;      private MySingleton(Context context) {         mCtx = context;         mRequestQueue = getRequestQueue();          mImageLoader = new ImageLoader(mRequestQueue,                 new ImageLoader.ImageCache() {                     private final LruCache<String, Bitmap>                             cache = new LruCache<String, Bitmap>(20);                      @Override                     public Bitmap getBitmap(String url) {                         return cache.get(url);                     }                      @Override                     public void putBitmap(String url, Bitmap bitmap) {                         cache.put(url, bitmap);                     }                 });     }      public static synchronized MySingleton getInstance(Context context) {          if (mInstance == null) {             mInstance = new MySingleton(context);         }         return mInstance;     }      public RequestQueue getRequestQueue() {          if (mRequestQueue == null) {             // getApplicationContext() is key, it keeps you from leaking the             // Activity or BroadcastReceiver if someone passes one in.             mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());         }         return mRequestQueue;     }      public <T> void addToRequestQueue(Request<T> req) {         getRequestQueue().add(req);     }      public ImageLoader getImageLoader() {         return mImageLoader;     }  }

Send a simple String request

Volley provides a convenience method Volley.newRequestQueue that sets up a RequestQueue for you, using default values, and starts the queue.

// Request a string response from the provided URL. StringRequest stringRequest = new StringRequest(Request.Method.GET, url,   new Response.Listener<String>() {    @Override    public void onResponse(String response) {     Log.i(TAG, response.substring(0, 500));    }   }, new Response.ErrorListener() {  @Override  public void onErrorResponse(VolleyError error) {   Log.e(TAG, "Error :" + error.getLocalizedMessage());  } });  stringRequest.setTag(queueTAG);  // Add the request to the RequestQueue. mRequestQueue.add(stringRequest);

Volley Demo in Android

Simple Request With Cache

A RequestQueue needs two things to do its job: a network to perform transport of the requests, and a cache to handle caching.

// Instantiate the cache Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap  // Set up the network to use HttpURLConnection as the HTTP client. Network network = new BasicNetwork(new HurlStack());  // Instantiate the RequestQueue with the cache and network. mRequestQueue = new RequestQueue(cache, network);  // Start the queue mRequestQueue.start();  // Formulate the request and handle the response. StringRequest stringRequest = new StringRequest(Request.Method.GET, url,   new Response.Listener<String>() {    @Override    public void onResponse(String response) {     Log.i(TAG, "simpleRequestWithNetworkCache : " + response.substring(0, 500));    }   },   new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError error) {     Log.e(TAG, "(simpleRequestWithNetworkCache) Error :" + error.getLocalizedMessage());    }   });  // Add the request to the RequestQueue. mRequestQueue.add(stringRequest);

Download an Image

Method 1

// Retrieves an image specified by the URL, displays it in the UI. ImageRequest request = new ImageRequest(IMAGE_URL,   new Response.Listener<Bitmap>() {    @Override    public void onResponse(Bitmap bitmap) {     mImageView.setImageBitmap(bitmap);    }   }, 0, 0, null,   new Response.ErrorListener() {    public void onErrorResponse(VolleyError error) {     mImageView.setImageResource(R.drawable.no_image);    }   }); // Access the RequestQueue through your singleton class. MySingleton.getInstance(this).addToRequestQueue(request);

Method 2

// Get the ImageLoader through your singleton class. mImageLoader = MySingleton.getInstance(this).getImageLoader();  // Set the URL of the image that should be loaded into this view, and // specify the ImageLoader that will be used to make the request. mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);

Method 3 – Load Image with DiskCache

ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(   LruBitmapCache.getCacheSize(getApplicationContext()))); mImgCont = mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,   R.drawable.android, R.drawable.no_image)); mImageView.setImageBitmap(mImgCont.getBitmap());

Load Local Image Without Listener

// Get the ImageLoader through your singleton class. mImageLoader = MySingleton.getInstance(this).getImageLoader(); mImgCont = mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,   R.drawable.android, R.drawable.no_image));  mImageView.setImageBitmap(mImgCont.getBitmap());

Load Local Image With Listener

// Get the ImageLoader through your singleton class. mImageLoader = MySingleton.getInstance(this).getImageLoader(); mImgCont = mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,   R.drawable.android, R.drawable.no_image));  mImageLoader.get(IMAGE_URL, new ImageLoader.ImageListener() {  @Override  public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {   mImageView.setImageBitmap(response.getBitmap());  }   @Override  public void onErrorResponse(VolleyError error) {   mImageView.setImageResource(R.drawable.no_image);  } });

Requesting Json with Volley

Volley provides the following classes for JSON requests:

  • JsonArrayRequest—A request for retrieving a JSONArray response body at a given URL.
  • JsonObjectRequest—A request for retrieving a JSONObject response body at a given URL, allowing for an optional JSONObject to be passed in as part of the request body.

Both classes are based on the common base class JsonRequest.

JsonObjectRequest jsObjRequest = new JsonObjectRequest   (Request.Method.GET, jsonUrl, null, new Response.Listener<JSONObject>() {     @Override    public void onResponse(JSONObject response) {     try {      Log.i(TAG, "Site : " + response.getString("Site"));     } catch (JSONException e) {     }    }   }, new Response.ErrorListener() {     @Override    public void onErrorResponse(VolleyError error) {     Log.i(TAG, "requestJSON :" + error.getLocalizedMessage());;    }   });  // Access the RequestQueue through your singleton class. MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);

Custom GSON request

Volley, be default doesn’t support GSON. But it gives the flexibility to do anything.Lets see how we can do this.

I am going to create a class for the GSON.

Below is my class for the GSON.

MyGson.java

package com.coderzheaven.volleydemo;  public class MyGson {      public String Site, demo;      public String getSite() {         return Site;     }      public void setSite(String site) {         Site = site;     } }

Now create a class named ‘GsonRequest’ for the GSON

package com.coderzheaven.volleydemo;  import com.android.volley.AuthFailureError; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.toolbox.HttpHeaderParser; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException;  import java.io.UnsupportedEncodingException; import java.util.Map;  public class GsonRequest<T> extends Request<T> {     private final Gson gson = new Gson();     private final Class<T> clazz;     private final Map<String, String> headers;     private final Response.Listener<T> listener;      /**      * Make a GET request and return a parsed object from JSON.      *      * @param url URL of the request to make      * @param clazz Relevant class object, for Gson's reflection      * @param headers Map of request headers      */     public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,                        Response.Listener<T> listener, Response.ErrorListener errorListener) {         super(Method.GET, url, errorListener);         this.clazz = clazz;         this.headers = headers;         this.listener = listener;     }      @Override     public Map<String, String> getHeaders() throws AuthFailureError {         return headers != null ? headers : super.getHeaders();     }      @Override     protected void deliverResponse(T response) {         listener.onResponse(response);     }      @Override     protected Response<T> parseNetworkResponse(NetworkResponse response) {         try {             String json = new String(                     response.data,                     HttpHeaderParser.parseCharset(response.headers));             return Response.success(                     gson.fromJson(json, clazz),                     HttpHeaderParser.parseCacheHeaders(response));         } catch (UnsupportedEncodingException e) {             return Response.error(new ParseError(e));         } catch (JsonSyntaxException e) {             return Response.error(new ParseError(e));         }     } }

Now to make the GSON call…

GsonRequest<MyGson> myReq = new GsonRequest<MyGson>(jsonUrl,   MyGson.class, null,   createSuccessListener(), // listener for success   createErrorListener());  // listener for failure  mRequestQueue.add(myReq);   private Response.Listener<MyGson> createSuccessListener() {   return new Response.Listener<MyGson>() {   @Override   public void onResponse(MyGson response) {    Log.i(TAG, "Response : " + response.getSite());   }  };  }  private Response.ErrorListener createErrorListener() {   return new Response.ErrorListener() {   @Override   public void onErrorResponse(VolleyError error) {    Log.i(TAG, "Error : " + error.getLocalizedMessage());   }  };  }

Volley Demo in Android

Here is the complete MainActivity Class.

package com.coderzheaven.volleydemo;  import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView;  import com.android.volley.Cache; import com.android.volley.Network; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.BasicNetwork; import com.android.volley.toolbox.DiskBasedCache; import com.android.volley.toolbox.HurlStack; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.ImageRequest; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.NetworkImageView; import com.android.volley.toolbox.StringRequest;  import org.json.JSONException; import org.json.JSONObject;  public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, View.OnClickListener {      public static final String TAG = "VolleyDemo";     public static final String queueTAG = "Req1";      ProgressBar mPb;     TextView mTextView;     ListView mListView;     ImageView mImageView;     ImageLoader mImageLoader;     NetworkImageView mNetworkImageView;     ImageLoader.ImageContainer mImgCont;      RequestQueue mRequestQueue = null;      private static final String IMAGE_URL =             "http://cdn3.pcadvisor.co.uk/cmsdata/features/3420161/Android_800_thumb800.jpg";     private static final String url = "http://www.coderzheaven.com";     private static final String jsonUrl = "http://echo.jsontest.com/Site/coderzheven.com/demo/Volley";      String[] listValues = new String[]{             "Simple Request",             "Simple Request With Network Cache",             "Download Image",             "Loading Local Image without Listener",             "Loading Local Image with Listener",             "Loading Image with Custom LRU Disk Cache",             "Request JSON",             "Custom GSON Request"     };      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);         setSupportActionBar(toolbar);          mPb = (ProgressBar) findViewById(R.id.toolbar_progress_bar);         mTextView = (TextView) findViewById(R.id.tv);         mListView = (ListView) findViewById(R.id.list1);         mImageView = (ImageView) findViewById(R.id.image1);         mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);          mNetworkImageView.setOnClickListener(this);         mImageView.setOnClickListener(this);          // Get a RequestQueue         mRequestQueue = MySingleton.getInstance(this.getApplicationContext()).                 getRequestQueue();          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,                 android.R.layout.simple_list_item_1, android.R.id.text1, listValues);          // Assign adapter to ListView         mListView.setAdapter(adapter);         mListView.setOnItemClickListener(this);          //hide the progreebar initially         hidePb();      }      void showPb() {         mPb.setVisibility(View.VISIBLE);     }      void hidePb() {         mPb.setVisibility(View.GONE);     }      void simpleRequest() {          showPb();          // Request a string response from the provided URL.         StringRequest stringRequest = new StringRequest(Request.Method.GET, url,                 new Response.Listener<String>() {                     @Override                     public void onResponse(String response) {                         mTextView.setVisibility(View.VISIBLE);                         Log.i(TAG, response.substring(0, 500));                         mTextView.setText("SimpleRequest : Response Received");                         hidePb();                     }                 }, new Response.ErrorListener() {             @Override             public void onErrorResponse(VolleyError error) {                 mTextView.setVisibility(View.VISIBLE);                 Log.e(TAG, "Error :" + error.getLocalizedMessage());                 mTextView.setText("SimpleRequest : Response Error");                 hidePb();             }         });          stringRequest.setTag(queueTAG);         // Add the request to the RequestQueue.         mRequestQueue.add(stringRequest);      }      void simpleRequestWithNetworkCache() {          showPb();          // Instantiate the cache         Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap          // Set up the network to use HttpURLConnection as the HTTP client.         Network network = new BasicNetwork(new HurlStack());          // Instantiate the RequestQueue with the cache and network.         mRequestQueue = new RequestQueue(cache, network);          // Start the queue         mRequestQueue.start();          // Formulate the request and handle the response.         StringRequest stringRequest = new StringRequest(Request.Method.GET, url,                 new Response.Listener<String>() {                     @Override                     public void onResponse(String response) {                         mTextView.setVisibility(View.VISIBLE);                         Log.i(TAG, "simpleRequestWithNetworkCache : " + response.substring(0, 500));                         mTextView.setText("SimpleRequestWithNetworkCache : Response Received");                         hidePb();                     }                 },                 new Response.ErrorListener() {                     @Override                     public void onErrorResponse(VolleyError error) {                         mTextView.setVisibility(View.VISIBLE);                         mTextView.setText("SimpleRequestWithNetworkCache : Response Error");                         Log.e(TAG, "(simpleRequestWithNetworkCache) Error :" + error.getLocalizedMessage());                         hidePb();                     }                 });          // Add the request to the RequestQueue.         mRequestQueue.add(stringRequest);      }      void downloadImage() {          showPb();          mNetworkImageView.setVisibility(View.GONE);         mImageView.setVisibility(View.VISIBLE);          // Retrieves an image specified by the URL, displays it in the UI.         ImageRequest request = new ImageRequest(IMAGE_URL,                 new Response.Listener<Bitmap>() {                     @Override                     public void onResponse(Bitmap bitmap) {                         mImageView.setImageBitmap(bitmap);                         hidePb();                     }                 }, 0, 0, null,                 new Response.ErrorListener() {                     public void onErrorResponse(VolleyError error) {                         mImageView.setImageResource(R.drawable.no_image);                         hidePb();                     }                 });         // Access the RequestQueue through your singleton class.         MySingleton.getInstance(this).addToRequestQueue(request);      }      // You can use ImageLoader by itself to display an Image.     void loadLocalImageWithoutListener() {          showPb();          mNetworkImageView.setVisibility(View.GONE);         mImageView.setVisibility(View.VISIBLE);          // Get the ImageLoader through your singleton class.         mImageLoader = MySingleton.getInstance(this).getImageLoader();         mImgCont = mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,                 R.drawable.android, R.drawable.no_image));          mImageView.setImageBitmap(mImgCont.getBitmap());          hidePb();     }      // You can use ImageLoader by itself to display an Image.     void loadLocalImageWithListener() {          showPb();          mNetworkImageView.setVisibility(View.GONE);         mImageView.setVisibility(View.VISIBLE);          // Get the ImageLoader through your singleton class.         mImageLoader = MySingleton.getInstance(this).getImageLoader();         mImgCont = mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,                 R.drawable.android, R.drawable.no_image));          mImageLoader.get(IMAGE_URL, new ImageLoader.ImageListener() {             @Override             public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {                 mImageView.setImageBitmap(response.getBitmap());                 hidePb();             }              @Override             public void onErrorResponse(VolleyError error) {                 mImageView.setImageResource(R.drawable.no_image);                 hidePb();             }         });     }      void downloadImage2() {          showPb();          mImageView.setVisibility(View.GONE);         mNetworkImageView.setVisibility(View.VISIBLE);          // Get the ImageLoader through your singleton class.         mImageLoader = MySingleton.getInstance(this).getImageLoader();          // Set the URL of the image that should be loaded into this view, and         // specify the ImageLoader that will be used to make the request.         mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);          hidePb();      }      void loadImageWithDiskCache() {          showPb();          mNetworkImageView.setVisibility(View.GONE);         mImageView.setVisibility(View.VISIBLE);          ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(                 LruBitmapCache.getCacheSize(getApplicationContext())));         mImgCont = mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,                 R.drawable.android, R.drawable.no_image));         mImageView.setImageBitmap(mImgCont.getBitmap());          hidePb();     }       void requestJSON() {          showPb();          JsonObjectRequest jsObjRequest = new JsonObjectRequest                 (Request.Method.GET, jsonUrl, null, new Response.Listener<JSONObject>() {                      @Override                     public void onResponse(JSONObject response) {                         mTextView.setVisibility(View.VISIBLE);                         try {                             Log.i(TAG, "Site : " + response.getString("Site"));                             mTextView.setText("Site : " + response.getString("Site") +                                     "/n" + "Demo : " + response.getString("demo"));                         } catch (JSONException e) {                          }                         hidePb();                     }                 }, new Response.ErrorListener() {                      @Override                     public void onErrorResponse(VolleyError error) {                         mTextView.setVisibility(View.VISIBLE);                         Log.i(TAG, "requestJSON :" + error.getLocalizedMessage());                         mTextView.setText("RequestJSON :JSON Error");                         hidePb();                     }                 });          // Access the RequestQueue through your singleton class.         MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);      }      private Response.Listener<MyGson> createSuccessListener() {         return new Response.Listener<MyGson>() {             @Override             public void onResponse(MyGson response) {                 Log.i(TAG, "Response : " + response.getSite());                 mTextView.setVisibility(View.VISIBLE);                 mTextView.setText("Site : " + response.getSite());                 hidePb();             }         };     }      private Response.ErrorListener createErrorListener() {         return new Response.ErrorListener() {             @Override             public void onErrorResponse(VolleyError error) {                 Log.i(TAG, "Error : " + error.getLocalizedMessage());                 mTextView.setVisibility(View.VISIBLE);                 mTextView.setText("Error : " + error.getLocalizedMessage());                 hidePb();             }         };     }      public void customGSONRequest() {         showPb();         GsonRequest<MyGson> myReq = new GsonRequest<MyGson>(jsonUrl,                 MyGson.class, null,                 createSuccessListener(),                 createErrorListener());         mRequestQueue.add(myReq);     }      @Override     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {          switch (position) {             case 0:                 simpleRequest();                 break;             case 1:                 simpleRequestWithNetworkCache();                 break;             case 2:                 downloadImage();                 break;             case 3:                 loadLocalImageWithoutListener();                 break;             case 4:                 downloadImage2();                 break;             case 5:                 loadImageWithDiskCache();                 break;             case 6:                 requestJSON();                 break;             default:                 customGSONRequest();                 break;         }      }      @Override     protected void onStop() {         super.onStop();         if (mRequestQueue != null) {             mRequestQueue.cancelAll(queueTAG);             Log.i(TAG, "Cancelled : " + queueTAG);         }     }      @Override     public void onClick(View v) {         v.setVisibility(View.GONE);     } }

Layouts

Layout – activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:fitsSystemWindows="true"     tools:context="com.coderzheaven.volleydemo.MainActivity">      <android.support.design.widget.AppBarLayout         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:theme="@style/AppTheme.AppBarOverlay">          <android.support.v7.widget.Toolbar             android:id="@+id/toolbar"             android:layout_width="match_parent"             android:layout_height="?attr/actionBarSize"             android:background="?attr/colorPrimary"             app:popupTheme="@style/AppTheme.PopupOverlay">              <ProgressBar                 android:id="@+id/toolbar_progress_bar"                 android:layout_width="30dp"                 android:layout_height="30dp"                 android:layout_gravity="right"                 android:layout_marginRight="10dp"                 android:indeterminateTint="#FFFFFF"                 android:indeterminateTintMode="src_in" />          </android.support.v7.widget.Toolbar>      </android.support.design.widget.AppBarLayout>      <include layout="@layout/content_main" />  </android.support.design.widget.CoordinatorLayout>

The Layout – content_main.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:paddingBottom="@dimen/activity_vertical_margin"     android:paddingLeft="@dimen/activity_horizontal_margin"     android:paddingRight="@dimen/activity_horizontal_margin"     android:paddingTop="@dimen/activity_vertical_margin"     app:layout_behavior="@string/appbar_scrolling_view_behavior"     tools:context="com.coderzheaven.volleydemo.MainActivity"     tools:showIn="@layout/activity_main">      <android.support.v7.widget.ListViewCompat         android:id="@+id/list1"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_alignParentTop="true"         android:layout_marginBottom="10dp"         android:scrollIndicators="right"         android:scrollbars="vertical" />      <TextView         android:id="@+id/tv"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_alignParentBottom="true"         android:layout_marginTop="5dp"         android:visibility="gone"         android:background="@android:color/holo_green_light"         android:padding="5dp"         android:textColor="@android:color/white" />      <android.support.v7.widget.AppCompatImageView         android:id="@+id/image1"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_centerInParent="true" />      <com.android.volley.toolbox.NetworkImageView         android:id="@+id/networkImageView"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_centerInParent="true" />  </RelativeLayout>

All Done.

You can download the complete Android Studio Source Code from here.

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Volley Demo in Android

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮