Android Volley框架(一):StringRequest、JsonObjectRequest、JsonArrayRequest
来源:互联网 发布:黑道家族 知乎 编辑:程序博客网 时间:2024/05/17 04:24
Volley GET/POST请求的基本步骤:
1. 创建一个RequestQueue对象。
2. 创建一个 StringRequest/JsonObjectRequest/JsonArrayRequest 对象。
3. 将 StringRequest/JsonObjectRequest/JsonArrayRequest 对象添加到RequestQueue里面。
关于JsonObjectRequest的post请求,有时无法正确解析上传的参数,原因在于服务端不接收json请求方式,只接收字符串,即服务端接收字符串,返回json串,这时需改写JsonObjectRequest方法,详见volley_JsonObjectRequestPost2()。
直接上代码,使用说明见注释:
第一步 搭建环境
下载jar包,新建工程,导入volley.jar
第二步 AndroidManifest.xml 文件
打开网络权限 (<uses-permission android:name="android.permission.INTERNET" />)
引入MyApplication (android:name="com.example.volleyfrademo.MyApplication")
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.volleyfrademo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:name="com.example.volleyfrademo.MyApplication"> <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
第三步 MyApplication.java 文件
package com.example.volleyfrademo;import com.android.volley.Request;import com.android.volley.RequestQueue;import com.android.volley.VolleyLog;import com.android.volley.toolbox.Volley;import android.app.Application;import android.text.TextUtils;public class MyApplication extends Application {public static final String TAG = "MyApplication";private RequestQueue queues;private static MyApplication instance;@Overridepublic void onCreate() {super.onCreate();instance = this;}public static synchronized MyApplication getInstance() { return instance; }public RequestQueue getRequestQueue(){if (queues == null) {queues = Volley.newRequestQueue(getApplicationContext()); }return queues;}public <T> void addToRequestQueue(Request<T> req, String tag) { req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); VolleyLog.d("Adding request to queue: %s", req.getUrl()); getRequestQueue().add(req);}public <T> void addToRequestQueue(Request<T> req) { req.setTag(TAG); getRequestQueue().add(req); }public void cancelPendingRequests(Object tag) { if (queues != null) { queues.cancelAll(tag); } }}
第四步 activity_main.xml 文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.volleyfrademo.MainActivity" > <TextView android:id="@+id/tv_resp1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <Button android:id="@+id/btn_get_string" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过StringRequest的GET方式请求服务器" /> <Button android:id="@+id/btn_post_string" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过JsonObjectRequest的POST方式请求服务器" /> <Button android:id="@+id/btn_get_jsonobject" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过JsonObjectRequest的GET方式请求服务器" /> <Button android:id="@+id/btn_post_jsonobject" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过JsonObjectRequest的POST方式请求服务器" /> <Button android:id="@+id/btn_post_jsonobject2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过JsonObjectRequest的POST方式请求服务器2" /> <Button android:id="@+id/btn_get_jsonarray" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过JsonArrayRequest的GET方式请求服务器" /></LinearLayout>
第五步 MainActivity.java文件
package com.example.volleyfrademo;import java.util.HashMap;import java.util.Map;import org.json.JSONArray;import org.json.JSONObject;import com.android.volley.AuthFailureError;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.Request.Method;import com.android.volley.Response.Listener;import com.android.volley.toolbox.JsonArrayRequest;import com.android.volley.toolbox.JsonObjectRequest;import com.android.volley.toolbox.StringRequest;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;/** * Volley GET/POST请求的基本步骤: * 1. 创建一个RequestQueue对象。 * 2. 创建一个 StringRequest/JsonObjectRequest/JsonArrayRequest 对象。 * 3. 将 StringRequest/JsonObjectRequest/JsonArrayRequest 对象添加到RequestQueue里面。 * * @author jiatao */public class MainActivity extends Activity implements OnClickListener{private TextView tv_resp1;private Button btn_get_string, btn_post_string, btn_get_jsonobject, btn_post_jsonobject, btn_post_jsonobject2, btn_get_jsonarray;private String urlget = "http://gc.ditu.aliyun.com/geocoding?a=苏州市";private String urlpost = "http://api.24ht.net/app/signin";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();setEvent();}private void initView() {tv_resp1 = (TextView) findViewById(R.id.tv_resp1);btn_get_string = (Button) findViewById(R.id.btn_get_string);btn_post_string = (Button) findViewById(R.id.btn_post_string);btn_get_jsonobject = (Button) findViewById(R.id.btn_get_jsonobject);btn_post_jsonobject = (Button) findViewById(R.id.btn_post_jsonobject);btn_post_jsonobject2 = (Button) findViewById(R.id.btn_post_jsonobject2);btn_get_jsonarray = (Button) findViewById(R.id.btn_get_jsonarray);}private void setEvent() {btn_get_string.setOnClickListener(this);btn_post_string.setOnClickListener(this);btn_get_jsonobject.setOnClickListener(this);btn_post_jsonobject.setOnClickListener(this);btn_post_jsonobject2.setOnClickListener(this);btn_get_jsonarray.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.btn_get_string:volley_StringRequestGet();break;case R.id.btn_post_string:volley_StringRequestGetPost();break;case R.id.btn_get_jsonobject:volley_JsonObjectRequestGet();break;case R.id.btn_post_jsonobject:volley_JsonObjectRequestPost();break;case R.id.btn_post_jsonobject2:volley_JsonObjectRequestPost2();break;case R.id.btn_get_jsonarray:volley_JsonArrayRequestGet();break;}}/* * StringRequest * StringRequest — To retrieve response body as String (ideally if you intend to parse the response by yourself) * 这个类可以用来从服务器获取String,如果想自己解析请求响应可以使用这个类,例如返回xml数据。它还可以使用重载的构造函数定制请求. * * GET方式请求服务器 */private void volley_StringRequestGet() {StringRequest request = new StringRequest(Method.GET, urlget, new Listener<String>() {@Overridepublic void onResponse(String response) {tv_resp1.setText(response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {tv_resp1.setText(error.toString());}});request.setTag("volley_StringRequestGet");MyApplication.getInstance().addToRequestQueue(request);}/* * StringRequest * StringRequest — To retrieve response body as String (ideally if you intend to parse the response by yourself) * 这个类可以用来从服务器获取String,如果想自己解析请求响应可以使用这个类,例如返回xml数据。它还可以使用重载的构造函数定制请求. * * POST方式请求服务器 */private void volley_StringRequestGetPost() {StringRequest request = new StringRequest(Method.POST, urlpost, new Listener<String>() {@Overridepublic void onResponse(String response) {tv_resp1.setText(response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {tv_resp1.setText(error.toString());}}){@Overrideprotected Map<String, String> getParams() throws AuthFailureError {Map<String, String> map = new HashMap<String, String>();map.put("user", "jt1024");map.put("psw", "111111");return map;}};request.setTag("volley_StringRequestGetPost");MyApplication.getInstance().addToRequestQueue(request);}/* * JsonObjectRequest * JsonObjectRequest — To send and receive JSON Object from the Server * 这个类可以用来发送和接收JSON对象。 * 这个类的一个重载构造函数允许设置适当的请求方法(DELETE,GET,POST和PUT)。 * * GET方式请求服务器 */private void volley_JsonObjectRequestGet() {JsonObjectRequest request = new JsonObjectRequest(Method.GET, urlget, null, new Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject response) {tv_resp1.setText(response.toString());}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {tv_resp1.setText(error.toString());}});request.setTag("volley_JsonObjectRequestGet");MyApplication.getInstance().addToRequestQueue(request);}/* * JsonObjectRequest * JsonObjectRequest — To send and receive JSON Object from the Server * 这个类可以用来发送和接收JSON对象。 * 这个类的一个重载构造函数允许设置适当的请求方法(DELETE,GET,POST和PUT)。 * * POST方式请求服务器 */private void volley_JsonObjectRequestPost() {Map<String, String> map = new HashMap<String, String>();map.put("user", "jt1024");map.put("psw", "111111");JSONObject object = new JSONObject(map);JsonObjectRequest request = new JsonObjectRequest(Method.POST, urlpost, object, new Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject response) {tv_resp1.setText(response.toString());}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {tv_resp1.setText(error.toString());}});request.setTag("volley_JsonObjectRequestPost");MyApplication.getInstance().addToRequestQueue(request);}/* * JsonObjectRequest * 如果服务端并不支持json的请求方式,比如常见的spring mvc服务端,就很难支持json的请求方式, * 那么就需要客户端以普通的post方式进行提交,服务端返回json串 * 首先在Activity类里,继承Request实现一个NormalPostRequest类 * * 服务端不支持json的请求方式 */private void volley_JsonObjectRequestPost2() {String url = "http://api.24ht.net/app/signin";Map<String, String> map = new HashMap<String, String>();map.put("user", "jt1024");map.put("psw", "111111");JSONObject object = new JSONObject(map);NormalPostRequest request = new NormalPostRequest(url, map, new Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject response) {tv_resp1.setText(response.toString());}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {tv_resp1.setText(error.toString());}});request.setTag("volley_JsonObjectRequestPost2");MyApplication.getInstance().addToRequestQueue(request);}private void volley_JsonArrayRequestGet() {JsonArrayRequest request = new JsonArrayRequest(urlget, new Listener<JSONArray>() {@Overridepublic void onResponse(JSONArray response) {tv_resp1.setText(response.toString());}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {tv_resp1.setText(error.toString());}});request.setTag("volley_JsonArrayRequestGet");MyApplication.getInstance().addToRequestQueue(request);}}
第六步 NormalPostRequest.java
package com.example.volleyfrademo;import java.io.UnsupportedEncodingException;import java.util.Map;import org.json.JSONException;import org.json.JSONObject;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.Response.ErrorListener;import com.android.volley.Response.Listener;import com.android.volley.toolbox.HttpHeaderParser;/** * * 对应MainActivity.java中的JsonObjectRequest-POST2: * 如果服务端并不支持json的请求方式,比如常见的spring mvc服务端,就很难支持json的请求方式, * 那么就需要客户端以普通的post方式进行提交,服务端返回json串 * 首先在Activity类里,继承Request实现一个NormalPostRequest类 * * @author jiatao * */public class NormalPostRequest extends Request<JSONObject>{private Map<String, String> mMap; private Listener<JSONObject> mListener; public NormalPostRequest(String url, Map<String, String> map, Listener<JSONObject> listener,ErrorListener errorListener) { super(Request.Method.POST, url, errorListener); mListener = listener; mMap = map; } //mMap是已经按照前面的方式,设置了参数的实例 @Override protected Map<String, String> getParams() throws AuthFailureError { return mMap; } //此处因为response返回值需要json数据,和JsonObjectRequest类一样即可 @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data,HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } @Override protected void deliverResponse(JSONObject response) { mListener.onResponse(response); }}
1 0
- Android Volley框架(一):StringRequest、JsonObjectRequest、JsonArrayRequest
- Android-Volley网络通信框架(StringRequest & JsonObjectRequest)
- Android高级之Volley框架(一):StringRequest
- 初识Volley:JsonObjectRequest、StringRequest、RequestQueue
- Volley StringRequest和JSONObjectRequest使用几个细节
- Volley StringRequest和JSONObjectRequest使用几个细节
- Volley StringRequest和JSONObjectRequest使用几个细节
- Volley StringRequest和JSONObjectRequest使用几个细节
- Volley StringRequest和JSONObjectRequest使用几个细节
- Volley StringRequest和JSONObjectRequest使用几个细节
- Volley StringRequest和JSONObjectRequest使用几个细节
- Volley StringRequest和JSONObjectRequest的使用
- Volley StringRequest和JSONObjectRequest使用几个细节
- Volley StringRequest和JSONObjectRequest使用几个细节
- Android-Volley网络通信框架(StringRequest和JsonObjectRequset)
- Volley的Get、Post方式(JsonObjectRequest、StringRequest)以及Volley获取图片的3种方式
- Android学习记录之Volley框架JSONObjectRequest
- Android Volley StringRequest
- 在B获取A的数据——深入浅出讲ContentProvider
- 1028. List Sorting (25)
- Android 增量更新实例
- 17-集合框架-15-常用对象API(集合框架-ArrayList集合存储自定对象)
- Cocos2d-x学习笔记(十)—— 缓存机制
- Android Volley框架(一):StringRequest、JsonObjectRequest、JsonArrayRequest
- Codeforces Round #315 (Div. 2)
- 读书笔记-《 我的成功可以复制》三
- strdup
- HDU 七夕节(求一个数的因子和)
- POJ 3461 Oulipo kmp 水过
- hdu 2094 产生冠军(拓扑排序)
- 17-集合框架-19-常用对象API(集合框架-HashSet存储自定义对象)
- 微信SDK开发学习第二课