Android 项目(详解二)—— 网络连接(1)

利用观察者模式
这里写图片描述
分析:

  • 手机提交数据到服务器:
    提交的数据有:url、提交信息、提交方法
  • 服务器端返回:
    服务器返回网络情况:1.无网络连接。2.服务器超时。3.连接失败(比如url错误404,500,503)4.连接成功

用的网络连接的地方:
登陆、刷新等。

判断网络连接是否正常:

这里的例子是使用Volley,并利用post方法(使用get方法也是一样的)。

  • 类:
    这里写图片描述

  • 1)InternetConnct类:

/**
 * Created by Administrator on 2015/10/8.
 * 网络连接类,需要网络连接时调用,判断1.是否有网络连接,2服务器是否超时,3,连接失败,4,连接成功
 */
public class InternetConnect {
    //单例
    private InternetConnect(){}
    private static InternetConnect mMyInternetConnect;
    public synchronized static InternetConnect newInstance(){
        if (mMyInternetConnect==null){
            mMyInternetConnect=new InternetConnect();
        }
        return mMyInternetConnect;
    }

    public interface onConnectionListener{
        /**
         * 没有网络连接
         */
        public void onNullInternet();

        /**
         * 网络连接失败
         * @param errorCode:错误码
         */
        public void onFailConnection(int errorCode);

        /**
         * 网络连接成功
         * @param response:服务器返回值
         */
        public void onSuccess(String response);

    }


    /**
     * 此方法的功能:使用dopost方法连接网络
     *
     * @param url:传入连接地址
     * @param params :传入post需要的参数
     * @param listener:传入监听器(使用时需要利用匿名内部类,其中实现onSucess,onError,onConnection方法)
     */

    public void addReqest( String url, final HashMap<String,String> params, final onConnectionListener listener){


            MySingleton.getInstance(AppApplication.getApplication()).getRequestQueue();//1.获得请求队列
            //判断是否已连接网络
            if(!NetworkUtils.isConnection(AppApplication.getApplication())){
                listener.onNullInternet();
                return;//如果没有连接直接返回
            }

            //2.创建http请求
            StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
                    new Response.Listener<String>() {


                        @Override
                        public void onResponse(String response) {
                            // mTextView.setText("Response is: "+ response.substring(0,500));
                            listener.onSuccess(response);//网络连接正常返回了值
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    listener.onFailConnection(error.networkResponse.statusCode);//网络连接出错。

                }
            }) {
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    //HashMap<String,String> map = mapString;
                    return params;
                }
            };
            MySingleton.getInstance(AppApplication.getApplication()).addToRequestQueue(stringRequest);//3.添加请求到队列中


    }


}

在类中创建一个接口,接口中必须实现了三个方法(成功,出错,连接网络是否正常),然后建一个方法,传入这个监听,在相应的位置调用这个方法。
这样就可以在其他地方使用啦,只需要匿名内部类实现三个方法,成功时运行什么,出错时运行什么,判断网络是否连接,都可以进行了。比如:

InternetConnect internetConnect = new InternetConnect();
    internetConnect.addReqest(getApplicationContext(), "http://www.baidu.com", null, new InternetConnect.onConnectionListener() {
        @Override
        public void onFailConnection(String posence) {
            mTextview.setText("成功");
        }

        @Override
        public void onError() {
            mTextview.setText("失败");

        }

        @Override
        public void onNullInternet() {
            mTextview.setText("连接");

        }
    });

  • 2.Volley使用时需要的单例MySingleton类:
/**
 * Created by 董梦娇 on 2015/10/8.
 * 功能:此类是实现单例模式,实现请求队列的单例。
 */
public class MySingleton {
    private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;

    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<String, Bitmap>(20);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });

    }

    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }
    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}
  • 3.所有的网络连接集在一个类中MyAllHttpMethod类:
/**
 * Created by 董梦娇 on 2015/10/10.
 * 这里写所有的连接,包括登录注册等
 */
public class MyAllHttpMethod {
    //单例
    private MyAllHttpMethod(){}
    private static MyAllHttpMethod myAllHttpMethod;
    public synchronized static MyAllHttpMethod newInstance(){
        if (myAllHttpMethod==null){
            myAllHttpMethod=new MyAllHttpMethod();
        }
        return myAllHttpMethod;
    }

    public static void login(HashMap<String,String> params,InternetConnect.onConnectionListener listener){
        InternetConnect.newInstance().addReqest(NetWorkConfig.URL_LOGIN,params,listener);

    }
    public static void register(){

    }
    public static void requestChart(){

    }

}
  • 工具包中关于网络连接的类:

    • NetworkUtils类:判断网络是否连接等的工具类
    • NetWorkConfig类:关于网络连接时用到的url。

menifest中的权限设置:

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值