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
原创粉丝点击