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

来源:互联网 发布:软件任务单模版 编辑:程序博客网 时间:2024/05/29 15:42

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

  • 手机提交数据到服务器:
    提交的数据有: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
原创粉丝点击