Android Volley Tutorial and Examples.
Volley is a fast HTTP client for android. If you have some data online, for example say in JSON or XML, you will need a HTTP client to connect to the server and download that data. After that you can parse the data into usable objects and render it in your widgets.
Learn Volley using these simple examples.
Example 1: HTTP Methods
1. How to make a HTTP GET and POST request in Volley
First you have to add Volley as an implementation statement in your app level build.gradle.
Please search for the latest version:
implementation 'com.android.volley:volley:1.0.0'
(a). MyApplication
Let’s start by creating an Application class. Here you can see we have the TAG as well as the RequestQueue
defined as static fields.
Then in the onCreate()
method we initialize our Volley using the Volley.newRequestQueue()
method.
We have also defined a static method to retrieve the the RequestQueue
instance.
import android.app.Application;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
public class MyApplication extends Application{
private static final String TAG = "MyApplication";
public static RequestQueue sRequestQueue;
@Override
public void onCreate() {
super.onCreate();
sRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueues(){
return sRequestQueue;
}
}
(b). Constants
Then a class to have your constants:
public class Constant {
public static final String JUHE_URL_GET = "http://apis.juhe.cn/mobile/get?phone=13429667914&key=562609042fbd47baa063b1a2c4637758";
public static final String JUHE_URL_POST = "http://apis.juhe.cn/mobile/get?";
public static final String JUHE_API_KEY = "562609042fbd47baa063b1a2c4637758";
public static final String VOLLEY_TAG = "volley_tag";
}
(c). VolleyInterface
Then we create an abstract method with several methods and our Listeners:
import android.content.Context;
import com.android.volley.Response;
import com.android.volley.VolleyError;
public abstract class VolleyInterface {
public Context mContext;
public static Response.Listener sListener;
public static Response.ErrorListener sErrorListener;
public VolleyInterface(Context context, Response.Listener<String> listener, Response.ErrorListener errorListener) {
this.mContext = context;
this.sListener = listener;
this.sErrorListener = errorListener;
}
public Response.Listener<String> loadingListener() {
sListener = new Response.Listener() {
@Override
public void onResponse(Object response) {
onMySuccess(response.toString());
}
};
return sListener;
}
public Response.ErrorListener errorListener(){
sErrorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
onMyError(error);
}
};
return sErrorListener;
}
public abstract void onMySuccess(String result);
public abstract void onMyError(VolleyError error);
}
(d). VolleyRequest
Then we can have our VolleyRequest class:
import android.content.Context;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.toolbox.StringRequest;
import com.example.innf.volleydemo.VolleyInterface;
import com.example.innf.volleydemo.app.MyApplication;
import java.util.Map;
public class VolleyRequest {
private static final String TAG = "VolleyRequest";
public static StringRequest sStringRequest;
public static Context sContext;
public static void RequestGet(Context context, String url, String tag, VolleyInterface volleyInterface) {
MyApplication.getHttpQueues().cancelAll(tag); /
sStringRequest = new StringRequest(Request.Method.GET, url, volleyInterface.loadingListener(), volleyInterface.errorListener());
sStringRequest.setTag(tag);
MyApplication.getHttpQueues().add(sStringRequest);
MyApplication.getHttpQueues().start();
}
public static void RequestPost(Context context, String url, String tag, Map<String, String> params, VolleyInterface volleyInterface) {
MyApplication.getHttpQueues().cancelAll(tag);
sStringRequest = new StringRequest(url, volleyInterface.loadingListener(), volleyInterface.errorListener()){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return super.getParams();
}
};
sStringRequest.setTag(tag);
MyApplication.getHttpQueues().add(sStringRequest);
MyApplication.getHttpQueues().start();
}
}
(e). MainActivity
First you create your activity with some constants:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final String STRING_GET_TAG = "string_get";
private static final String STRING_POST_TAG = "string_post";
private static final String JSON_OBJECT_GET_TAG = "json_object_get";
private static final String JSON_OBJECT_POST_TAG = "json_object_post";
private String tag = "";
.......
Then:
1. How to perform a HTTP GET String request
You can see we are using the StringRequest
class.
private String volleyGetStringRequest() {
StringRequest request = new StringRequest(Request.Method.GET, Constant.JUHE_URL_GET,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this, response, Toast.LENGTH_SHORT).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
}
});
request.setTag(STRING_GET_TAG);
MyApplication.getHttpQueues().add(request);
return request.getTag().toString();
}
2. How to perform a HTTP GET Object request
This time round we use the JsonObjectRequest
class. We will show the response or error in the Toast message.
private String volleyGetJsonObjectRequest() {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, Constant.JUHE_URL_GET, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
}
});
request.setTag(JSON_OBJECT_GET_TAG);
MyApplication.getHttpQueues().add(request);
return request.getTag().toString();
}
3. Making a Custom GET Request
private void volleyRequestGetByCustom() {
VolleyRequest.RequestGet(this, Constant.JUHE_URL_GET, STRING_GET_TAG, new VolleyInterface(this, VolleyInterface.sListener, VolleyInterface.sErrorListener) {
@Override
public void onMySuccess(String result) {
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
Log.i(TAG, result);
}
@Override
public void onMyError(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
}
});
}
4. How to make a HTTP String POST Request
Let’s make a HTTP POST request using the StringRequest
:
private String volleyPostStringRequest() {
StringRequest request = new StringRequest(Request.Method.POST, Constant.JUHE_URL_POST,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this, response, Toast.LENGTH_SHORT).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> hashMap = new HashMap<>();
hashMap.put("phone", "13429667914");
hashMap.put("key", "562609042fbd47baa063b1a2c4637758");
return hashMap;
}
};
request.setTag(STRING_POST_TAG);
MyApplication.getHttpQueues().add(request);
return request.getTag().toString();
}
4. How to make a custom HTTP JSONObject POST Request
We now make a HTTP POST request using the JsonObjectRequest
:
private String volleyGetJsonObjectRequest() {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, Constant.JUHE_URL_GET, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
}
});
request.setTag(JSON_OBJECT_GET_TAG);
MyApplication.getHttpQueues().add(request);
return request.getTag().toString();
}
Add all the above code in the main activity. Then add also your onCreate()
and onPost()
methods:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// tag = volleyGetStringRequest();
// tag = volleyGetJsonObjectRequest();
tag = volleyPostStringRequest();
// tag = volleyPostJsonObjectRequest();
// volleyRequestGetByCustom();
}
@Override
protected void onStop() {
super.onStop();
// cancelAll()
MyApplication.getHttpQueues().cancelAll(tag);
}
}
Example 2: Android Volley – Fill Spinner
from JSON"
In this case our widget is the Spinner, or rather the dropdown component. Data will be downloaded in JSON format, parsed and rendered in the spinner. Volley is used as the HTTP client.
Step 1: Install Volley
You need to install Volley first.
Step 2: Add Internet Permission
Include the internet permission in your android manifest, since you will need to use the internet to download the JSON data:
<uses-permission android:name="android.permission.INTERNET"/>
Step 3: Design Layout
Simply add a spinner, a textview and floating action button in your activity_main.xml
. The spinner will be used to list the country names, the textview to show the selected country details while the floating action button to initiate the download operation.
Step 4: Create Model class
In this case the model class is a country. Data that will be downloaded from the server will be a list of countries. Each country will properties like id, name, flag and states.
Country.java
package com.spencerstudios.nullandvoid;
public class Country {
private String cid;
private String name;
private String flag;
private String states;
public Country(String cid, String name, String flag, String states) {
this.cid = cid;
this.name = name;
this.flag = flag;
this.states = states;
}
public String getName() {
return name;
}
public String getCid() {
return cid;
}
public String getFlag() {
return flag;
}
public String getStates() {
return states;
}
@Override
public String toString() {
return this.name;
}
}
Step 5: Write Activity Code
Start by making imports, including importing Volley classes as well as classes to help us parse our JSON data:
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
Then create the activity by extending the AppCompatActivity:
public class MainActivity extends AppCompatActivity {
Then we need to fetch data from the url, so create a method to do so:
private void fetchJsonDataFromUrl() {
Now instantiate the JsonArrayRequest
passing in the request method, the url as well as a response callback. In this case we making a HTTP GET
request:
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, URL, null, new Response.Listener<JSONArray>() {
Now override the onResponse()
, then also pass an error listener to our JsonArrayRequest
constructor, then override the onErrorResponse()
:
@Override
public void onResponse(JSONArray response) {
parseJson(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
Then add the JsonArrayRequest
instance in your Volley request queue:
Volley.newRequestQueue(this).add(jsonArrayRequest);
}
Now that you;ve seen how to download JSON data using Volley, you need to parse that data and that is not the responsibility of Volley. So we create the following method which will receive a JSON response and parse it:
private void parseJson(JSONArray response) {
List<Country> countries = new ArrayList<>();
try {
for (int i = 0; i < response.length(); i++) {
JSONObject obj = response.getJSONObject(i);
String cid = obj.getString("CID");
String countryName = obj.getString("CName");
String flag = obj.getString("Flag");
String states = obj.getString("States");
countries.add(new Country(cid, countryName, flag, states));
}
initSpinner(countries);
} catch (JSONException e) {
e.printStackTrace();
}
}
When the user selects an country in the spinner, we will render the country details in the textview. The following method will do that:
private void initSpinner(final List<Country> countries) {
if (countries.size() > 0) {
ArrayAdapter<Country> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, countries);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Country country = countries.get(position);
String meta = "ID: " + country.getCid() + "nNAME: " + country.getName() + "nFLAG: " + country.getFlag() + "nSTATES: " + country.getStates();
textView.setText(meta);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
Here is the ful code for the main activity:
MainActivity.java
public class MainActivity extends AppCompatActivity {
/*
because we need to access the internet, we'll need
to add the internet permission, include the following
line in the manifest file:
<uses-permission android:name="android.permission.INTERNET"/>
*/
private static final String URL = "http://app.visiontechme.com:85/MRMV10WSNEW/easymeeting.asmx/GetCountryNames";
private Spinner spinner;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
spinner = findViewById(R.id.spinner);
textView = findViewById(R.id.text_view);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fetchJsonDataFromUrl();
}
});
}
private void fetchJsonDataFromUrl() {
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, URL, null, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
parseJson(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
Volley.newRequestQueue(this).add(jsonArrayRequest);
}
private void parseJson(JSONArray response) {
List<Country> countries = new ArrayList<>();
try {
for (int i = 0; i < response.length(); i++) {
JSONObject obj = response.getJSONObject(i);
String cid = obj.getString("CID");
String countryName = obj.getString("CName");
String flag = obj.getString("Flag");
String states = obj.getString("States");
countries.add(new Country(cid, countryName, flag, states));
}
initSpinner(countries);
} catch (JSONException e) {
e.printStackTrace();
}
}
private void initSpinner(final List<Country> countries) {
if (countries.size() > 0) {
ArrayAdapter<Country> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, countries);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Country country = countries.get(position);
String meta = "ID: " + country.getCid() + "nNAME: " + country.getName() + "nFLAG: " + country.getFlag() + "nSTATES: " + country.getStates();
textView.setText(meta);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
}
Reference
Download the code here.