Android通过Volley请求WebApi共通

Posted on Posted in Android

思路:

1.把请求网络的方法放到一个类里面

2.创建一个接口将数据发给Activity

3.Activity 实现接口获得服务器返回的数据

4.解析数据

 

来我们一先来看第一步

请求网络

在这里请求网络我们用Volley 。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。当然Volley对加载图片的时候内存控制的很好,后面加载图片还会用到。

创建一个CallWebservice 类

package org.shuaibi.hi_blog.utils;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import org.json.JSONObject;

import android.content.Context;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

public class CallWebservice  {

    private final String HTTPHOST="http://blog.haojima.net/api/home/";  //主机地址
    public static RequestQueue requestQueue;
    private Context mContnxt; 
    private int mMark;
    private ServiceCallBack mServiceCallBack; 

    public CallWebservice(Context context,String function,HashMap<String, String> params,int mark)
    {
        this.mContnxt=context;
        this.mMark=mark;
        this.mServiceCallBack=(ServiceCallBack) context;
        createUrl(function,params);
    }

    public void createUrl(String function,HashMap<String, String> params)
    {
        //拼主机名和方法名

        String url=this.HTTPHOST+function;
        //拼参数

        if(params!=null){
            url+="?";
            Iterator<Entry<String, String>> iterator = params.entrySet().iterator();
            while (iterator.hasNext()) {
                Entry<String, String> obj = (Entry<String, String>) iterator.next();
                url+=obj.getKey().toString()+"="+obj.getValue().toString()+"&";
            }
            url=url.substring(0, url.length()-1); //去掉最后一个 &
        }
        //请求服务器

        getJsonResult(url);

    }

    public void getJsonResult(String url)
    {
        if(CallWebservice.requestQueue==null)
        {
            requestQueue=Volley.newRequestQueue(mContnxt);
        }
        JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(url, null, new Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                mServiceCallBack.serviceResult(response, mMark);
            }
        }, new ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
             Toast.makeText(mContnxt, error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
        requestQueue.add(jsonObjectRequest);
    }
}

下面来写接口

package org.shuaibi.hi_blog.utils;

import org.json.JSONObject;

/**

 * 

 * @描述: 服务器返回值回调

 * @作者: ZeroX

 * @时间: 2015-9-16

 * @参数: 

 * @接口: 

 *

 */
public interface ServiceCallBack {
    void serviceResult(JSONObject jsonObject,int mark);
}

看见了接口的代码很简单就几句话, 里面的jsonObject 就是服务器返回值 mark 是标记当一个Activity里有多个请求网络的地方 我们就可以用mark 区分哈哈 。

这样请求网络就算完成了,下面介绍用法

HashMap<String, String> params=new HashMap<String, String>();
        params.put("idex",mIndex+"");
        params.put("sizePage", mPageSize+"");
        params.put("ContentLength", "80");
        new CallWebservice(this,"get",params,GETBLOGLIST);

上面代码就是调用一个 方法的写法  里面的GETBLOGLIST 是定义的一个常量我写的1,用来区分多个网络请求的这个数就是 上面接口里的mark

最后就是Activity实现 ServiceCallBack 这个接口了 实现一下serviceResult 这个方法

public class MainActivity extends Activity implements ServiceCallBack
@Override
    public void serviceResult(JSONObject jsonObject, int mark) {
        try {
            switch (mark) {
            case GETBLOGLIST:
                 blogResultHander(jsonObject.getJSONArray("blog"));
mPageCount=jsonObject.getInt("total");
                break;
            default:
                break;
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        }

    }

最后就是解析Json了

 /**

     * 博客列表返回值处理

     * @param jsonArray 博客列表

     */
    public void blogResultHander(JSONArray jsonArray) throws Exception
    {
        for (int i = 0; i &lt; jsonArray.length(); i++) {
            JSONObject jsonObject=jsonArray.getJSONObject(i);
            HashMap&lt;String, String&gt; itemHashMap=new HashMap&lt;String, String&gt;();
            itemHashMap.put("UserName", jsonObject.getJSONObject("BlogUsersSet").getString("UserNickname"));
            itemHashMap.put("CreateTime", jsonObject.getString("BlogCreateTime"));
            itemHashMap.put("Title", jsonObject.getString("BlogTitle"));
            itemHashMap.put("Content", jsonObject.getString("BlogContent"));
            itemHashMap.put("Comment", jsonObject.getString("BlogCommentNum"));
            itemHashMap.put("Visibility", jsonObject.getString("BlogReadNum"));
            mBlogList.add(itemHashMap); //这是一个List&lt;HashMap&lt;String,String&gt;&gt;
        }

    

    }

哈哈我们已经把 重服务器返回的数据放到List里了。

上面代码只是提共参考哟 完整代码请点击这里 

发表评论

电子邮件地址不会被公开。 必填项已用*标注