利用观察者模式
分析:
- 手机提交数据到服务器:
提交的数据有: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>