How to use Android Async Http Client?
A popular third-party library called android-async-http helps handle the entire process of sending and parsing network requests for us in a more robust and easy-to-use way.
Setup
Add this library to our
app/build.gradle file:dependencies {
compile 'com.loopj.android:android-async-http:1.4.9'
}
If you are upgrading from previous versions, you need to change these import statements for the
Header class from:import org.apache.http.Header;
Replaced with this line:
import cz.msebera.android.httpclient.Header;
If you have any other import statements that start with
org.apache.http, you also need to change them to cz.msebera.android.httpclient.
Mac users can use the following shortcut:
brew install gnu-sed find . -name '*.java' -exec gsed -i 's/org.apache.http/cz.msebera.android.httpclient/g' \{\} +
Sending a Network Request
Now, we just create an
AsyncHttpClient, and then execute a request specifying an anonymous class as a callback:import com.loopj.android.http.*;
import cz.msebera.android.httpclient.Header;
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.get("http://www.google.com", params, new TextHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, String res) {
// called when response HTTP status is "200 OK"
}
@Override
public void onFailure(int statusCode, Header[] headers, String res, Throwable t) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
}
);
This will automatically execute the request asynchronously and fire the
onSuccess when the response returns a success code and onFailure if the response does not.Sending a JSON Request
Similar to sending a regular HTTP request, android-async-http can also be used for sending JSON API requests:
String url = "https://ajax.googleapis.com/ajax/services/search/images";
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("q", "android");
params.put("rsz", "8");
client.get(url, params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// Root JSON in response is an dictionary i.e { "data : [ ... ] }
// Handle resulting parsed JSON response here
}
@Override
public void onFailure(int statusCode, Header[] headers, String res, Throwable t) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
});
Assuming the callback uses
JsonHttpResponseHandler, the request will be sent out with the appropriate parameters passed in the query string and then the response can be parsed as JSON and made available within onSuccess. Check the Converting JSON to Models guide for more details on parsing a JSON response manually.Below real Example:
MainActiviy.class
public class MainActivity extends AppCompatActivity {
String URL="https://api.androidhive.info/contacts/";
JSONObject object=new JSONObject();
ListView listView;
ArrayList<Model>alList=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.listView);
apiCall();
}
public void apiCall() {
final ProgressDialog pd=new ProgressDialog(MainActivity.this);
AsyncHttpClient client=new AsyncHttpClient();
client.get(URL,new JsonHttpResponseHandler(){
@Override
public void onStart() {
super.onStart();
pd.setMessage("Loading.....");
pd.setTitle("Get Date");
pd.show();
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject res) {
super.onSuccess(statusCode, headers, res);
Toast.makeText(MainActivity.this
, "JSON Response get", Toast.LENGTH_SHORT).show();
pd.hide();
try {
JSONArray array=res.getJSONArray("contacts");
for (int i=0;i<array.length();i++){
Model m=new Model(array.getJSONObject(i).getString("name"),array.getJSONObject(i).getString("email"));
alList.add(m);
Adapter adapter=new Adapter(MainActivity.this,alList);
listView.setAdapter(adapter);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
super.onFailure(statusCode, headers, responseString, throwable);
Toast.makeText(MainActivity.this, "Something Wrong :"+statusCode, Toast.LENGTH_SHORT).show();
pd.hide();
}
@Override
public void onFinish() {
super.onFinish();
pd.dismiss();
}
});
}
}