码迷,mamicode.com
首页 > 移动开发 > 详细

android 从零开始搭建框架系列(1)

时间:2015-04-22 18:08:07      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:开发   android   缓存   框架   

工作几年发现自己没留下啥东西,天天开发开发,没总结过。 这次想总结下。故而写这个系列的博客。希望对广大的开发者有所帮助。


OK 首先先分析下 框架的作用,以及框架所应拥有的功能
框架有啥好处那,你只要写了一次以后就可以重复利用了。
无非是拷贝过来拷贝过去。写的框架必须简单易懂。


功能以及分模块:
1. 联网 模块
2. 数据缓存模块。(缓存这里比较重要,因为每次不肯能都去获取新数据,太费流量了。)
3. 图片联网获取并加载模块。以及图片的缓存
4. 数据库模块

ok 废话不多说 上点干货。下面是框架的结构图

技术分享


需要一个jar包 httpmime.jar

由于Android附带的HttpClient版本暂不支持多部件POST请求,所以我们需要用到一个HttpMime开源项目,该组件是专门处理与MIME类型有关的操作。因为HttpMime是包含在HttpComponents 项目中的,所以我们需要去apache官方网站下载HttpComponents,然后把其中的HttpMime.jar包放到项目中去


先写个联网框架:httpmanager- 这个只是用来联网的

package com.example.net.manager;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.util.EntityUtils;

import com.example.net.BaseApplication;
import com.example.net.Interface.IDownloadListener;
import com.example.net.utils.LogUtil;
import com.example.net.utils.NetWorkUtil;

import android.net.http.AndroidHttpClient;

/**
 * HttpManager 最基本的联网请求 只做最基本的联网操作
 * 
 * @author liuml
 * 
 *         2015-3-12 下午3:14:27
 */
public class HttpManager {

    private static final String TAG = "HttpManager";

    public static HttpClient getDefaultHttpClient() {

        //xxxxx 输入自己的项目名字
        AndroidHttpClient httpClient = AndroidHttpClient.newInstance("xxxxx");
        // HttpClient httpClient = new DefaultHttpClient();
        return httpClient;
    }

    /**
     * 不带参数的get请求
     * 
     * @param url
     * @param listener
     * @return
     */
    public static String requestJsonWithGet(String url, IDownloadListener listener) {

        // 判断网路状态
        if (BaseApplication.mNetworkState == NetWorkUtil.STATE_DISCONNECT) {
            if (listener != null) {
                listener.onNetworkDisconnect();
            }
            return null;
        }
        String requestResult = null;

        HttpClient httpClient = getDefaultHttpClient();
        HttpGet httpRequest = new HttpGet(url);

        LogUtil.d(TAG, "url = " + url);

        try {
            HttpResponse response = httpClient.execute(httpRequest);

            int statusCode = response.getStatusLine().getStatusCode();

            LogUtil.d(TAG, "服务器返回码" + statusCode);
            if (HttpStatus.SC_OK == statusCode) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    requestResult = EntityUtils.toString(entity);

                    if (listener != null) {
                        listener.onDownloadSuccessed(requestResult);
                    }
                } else {
                    if (listener != null) {
                        listener.onDownloadFailed();
                    }
                }
            } else {
                if (listener != null) {
                    listener.onDownloadFailed();
                }
            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
            listener.onDownloadFailed();
        } catch (IOException e) {
            e.printStackTrace();
            listener.onDownloadFailed();
        } finally {
            if (httpClient instanceof AndroidHttpClient) {
                ((AndroidHttpClient) httpClient).close();
            }

        }

        return requestResult;

    }

    /**
     * 带参数的get请求
     * 
     * @param url
     * @param getParameters
     * @param listener
     * @return
     */
    public static String requestJsonWithGet(String url, List<NameValuePair> parameters, IDownloadListener listener) {
        if (BaseApplication.mNetworkState == NetWorkUtil.STATE_DISCONNECT) {
            if (listener != null) {
                listener.onNetworkDisconnect();
            }
            return null;
        }

        String murl = url + "?" + NameValuePair2String(parameters);
        LogUtil.d(TAG, "带参数的Get请求(从网络)= " + murl);

        String requestResult = null;
        HttpClient httpClient = getDefaultHttpClient();
        HttpGet httpRequest = new HttpGet(murl);
        try {
            HttpResponse response = httpClient.execute(httpRequest);
            int statusCode = response.getStatusLine().getStatusCode();

            if (HttpStatus.SC_OK == statusCode) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    requestResult = EntityUtils.toString(entity);
                    if (listener != null) {
                        listener.onDownloadSuccessed(requestResult);
                    }
                } else {
                    if (listener != null) {
                        listener.onDownloadFailed();
                    }
                }

            } else {
                if (listener != null) {
                    listener.onDownloadFailed();
                }
            }
        } catch (ClientProtocolException e) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            e.printStackTrace();
        } catch (IOException e) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            e.printStackTrace();
        } finally {
            if (httpClient instanceof AndroidHttpClient) {
                ((AndroidHttpClient) httpClient).close();
            }
        }
        return requestResult;
    }

    /**
     * 带参数的Post请求
     * 
     * @param url
     * @param postParameters
     * @param listener
     * @return
     */
    public static String requestJsonWithPost(String url, List<NameValuePair> postParameters, IDownloadListener listener) {
        LogUtil.d(TAG, "requestJsonWithPost");
        if (BaseApplication.mNetworkState == NetWorkUtil.STATE_DISCONNECT) {
            if (listener != null) {
                listener.onNetworkDisconnect();
            }
            return null;
        }
        String requestResult = null;
        HttpPost httpRequest = new HttpPost(url);
        if (postParameters != null && postParameters.size() > 0) {
            UrlEncodedFormEntity entity;
            try {
                entity = new UrlEncodedFormEntity(postParameters, "utf-8");
                httpRequest.setEntity(entity);
            } catch (UnsupportedEncodingException e) {
                if (listener != null) {
                    LogUtil.d(TAG, "UserLogin UnsupportedEncodingException, e = " + e);
                    listener.onDownloadFailed();
                }
                return null;
            }
        }

        BasicHttpParams params = new BasicHttpParams();
        params.setParameter(HttpConnectionParams.CONNECTION_TIMEOUT, 30000);
        HttpClient httpClient = new DefaultHttpClient(params);
        HttpResponse response = null;
        try {
            response = httpClient.execute(httpRequest);
            int statusCode = response.getStatusLine().getStatusCode();

            if (HttpStatus.SC_OK == statusCode) {
                HttpEntity entity = response.getEntity();
                requestResult = EntityUtils.toString(entity);
                if (listener != null) {
                    LogUtil.d(TAG, "UserLogin onDownloadSuccessed");
                    listener.onDownloadSuccessed(requestResult);
                }
            } else {
                if (listener != null) {
                    LogUtil.d(TAG, "UserLogin HttpStatus.SC_OK != statusCode");
                    LogUtil.d(TAG, "状态码 = " + statusCode);
                    listener.onDownloadFailed();

                }
            }
        } catch (Exception e) {
            if (listener != null) {
                LogUtil.d(TAG, "UserLogin HttpStatus.SC_OK != statusCode");

                listener.onDownloadFailed();
            }
            e.printStackTrace();
        } finally {
            if (httpClient instanceof AndroidHttpClient) {
                ((AndroidHttpClient) httpClient).close();
            }
        }
        return requestResult;
    }

    /**
     * 参数转化
     * 
     * @param parameters
     * @return
     */
    private static String NameValuePair2String(List<NameValuePair> parameters) {
        StringBuilder builder = new StringBuilder();
        for (NameValuePair item : parameters) {
            builder.append(item.getName());
            builder.append("=");
            builder.append(item.getValue());
            builder.append("&");
        }
        builder.deleteCharAt(builder.length() - 1);
        return builder.toString();
    }
}

然后我创建一个json管理器 jsonmanager

jsonManager主要的功能有:

  1. 创建线程池,处理联网请求,异步加载。
  2. 判断网络状态,以及 调用存储json数据的方法。
  3. 。。反正就是一系列判断。
package cn.com.psy.xinhaijiaoyu.mamager;

import java.io.File;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.http.NameValuePair;

import android.content.Context;
import cn.com.psy.xinhaijiaoyu.XinHaiApplication;
import cn.com.psy.xinhaijiaoyu.Interface.IDownloadListener;
import cn.com.psy.xinhaijiaoyu.cache.JsonCacheManager;
import cn.com.psy.xinhaijiaoyu.util.LogUtil;
import cn.com.psy.xinhaijiaoyu.util.NetWorkUtil;

/**
 * json 数据管理
 * 
 * @author liuml 2014-2-27
 * 
 */
public class JsonManager {
    private static final String TAG = "JsonManager";
    private JsonCacheManager mJsonCacheManager;
    private ExecutorService mExecutorService;
    private static final int THREAD_POOL_SIZE = 5;

    public JsonManager(Context context) {
        mJsonCacheManager = new JsonCacheManager(context);
        mExecutorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
    }

    /**
     * 没有参数的get请求
     * 
     * @param url
     * @param listener
     */
    public void loadJsonByGet(String url, IDownloadListener listener) {
        loadJsonByGet(url, listener, false);
    }

    /**
     * 有参数的get请求,无服务器判断
     * 
     * @param url
     * @param parameters
     * @param listener
     */
    public void loadJsonByGet(final String url, final List<NameValuePair> parameters, final IDownloadListener listener) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;
        }

        mExecutorService.execute(new Runnable() {

            @Override
            public void run() {
                loadJsonByHttpGet(url, parameters, listener);
            }
        });
    }

    /**
     * 有参数的get请求 有服务器判断
     * 
     * @param url
     * @param parameters
     * @param listener
     * @param fromServer
     */
    public void loadJsonByGet(final String url, final List<NameValuePair> parameters, final IDownloadListener listener, final Boolean fromServer) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;
        }

        mExecutorService.execute(new Runnable() {

            @Override
            public void run() {
                loadJsonByJsonGet(url, parameters, listener, fromServer);
            }
        });
    }

    public void loadJsonByGet(final String url, final List<NameValuePair> parameters, final IDownloadListener listener, final Boolean fromServer, final long timeout) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;
        }

        mExecutorService.execute(new Runnable() {

            @Override
            public void run() {
                loadJsonByJsonGet(url, parameters, listener, fromServer, timeout);
            }
        });
    }

    /**
     * 获取数据get请求
     * 
     * @param url
     * @param parameters
     * @param listener
     */
    protected void loadJsonByHttpGet(String url, List<NameValuePair> parameters, IDownloadListener listener) {
        String json = null;
        json = loadJsonFromServerByHttpGet(url, parameters, listener);
        LogUtil.d(TAG, "loadJsonByHttpGet==" + json);
    }

    /**
     * 没有参数的get请求
     * 
     * @param url
     * @param listener
     * @param fromServer
     */
    public void loadJsonByGet(final String url, final IDownloadListener listener, final boolean fromServer) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;
        }

        mExecutorService.execute(new Runnable() {

            @Override
            public void run() {
                loadJsonByHttpGet(url, listener, fromServer);
            }
        });
    }

    /**
     * 无参数的post请求
     * 
     * @param url
     * @param listener
     * @param fromServer
     */
    public void loadJsonByPost(final String url, final IDownloadListener listener, final boolean fromServer) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;
        }

        mExecutorService.execute(new Runnable() {

            @Override
            public void run() {
                loadJsonByHttpPost(url, listener, fromServer);
            }
        });
    }

    public void loadJsonByHttpGet(String url, IDownloadListener listener, boolean fromServer) {
        String json = null;
        if (!fromServer || XinHaiApplication.mNetworkState == NetWorkUtil.STATE_DISCONNECT) {
            json = getJsonFromCacheFile(url);
            if (json != null) {
                if (listener != null) {
                    listener.onDownloadSuccessed(json);
                }
                return;
            }
        }

        json = loadJsonFromServerByHttpGet(url, listener);
        if (json != null) {
            mJsonCacheManager.addJsonToDiskCache(url, json);
        }
    }

    public void loadJsonByHttpPost(String url, IDownloadListener listener, boolean fromServer) {
        String json = null;
        if (!fromServer || XinHaiApplication.mNetworkState == NetWorkUtil.STATE_DISCONNECT) {
            json = getJsonFromCacheFile(url);
            if (json != null) {
                if (listener != null) {
                    listener.onDownloadSuccessed(json);
                }
                return;
            }
        }

        json = loadJsonFromServerByHttpPost(url, listener);
        if (json != null) {
            mJsonCacheManager.addJsonToDiskCache(url, json);
        }
    }

    private String loadJsonFromServerByHttpGet(String url, IDownloadListener listener) {
        return HttpManager.requestJsonWithGet(url, listener);
    }

    private String loadJsonFromServerByHttpGet(String url, List<NameValuePair> parameters, IDownloadListener listener) {
        return HttpManager.requestJsonWithGet(url, parameters, listener);
    }

    private String loadJsonFromServerByHttpPost(String url, IDownloadListener listener) {
        return HttpManager.requestJsonWithPost(url, listener);
    }

    /**
     * 有参数的post请求
     * @param url
     * @param parameters
     * @param listener
     */
    public void loadJsonByPost(String url, List<NameValuePair> parameters, IDownloadListener listener) {
        loadJsonByPost(url, parameters, listener, false);
    }

    public void loadJsonByPost(final String url, final List<NameValuePair> parameters, final IDownloadListener listener, final boolean fromServer) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;
        }

        mExecutorService.execute(new Runnable() {

            @Override
            public void run() {
                loadJsonByHttpPost(url, parameters, listener);
            }
        });
    }

    // 直接访问网络
    public void loadJsonByHttpPost(String url, List<NameValuePair> parameters, IDownloadListener listener) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;

        }

        String json = null;
        String urlParams = url + "?" + NameValuePair2String(parameters);

        LogUtil.d(TAG, "post请求 url = " + urlParams);
        json = loadJsonFromServerByHttpPost(url, parameters, listener);
        if (json != null) {
            mJsonCacheManager.addJsonToDiskCache(urlParams, json);
        }
    }

    private String loadJsonFromServerByHttpPost(String url, List<NameValuePair> parameters, IDownloadListener listener) {
        return HttpManager.requestJsonWithPost(url, parameters, listener);
    }

    private String getJsonFromCacheFile(String url) {
        return mJsonCacheManager.getJsonFromDiskCache(url);
    }

    private String getJsonFromCacheFile(String url, long timeout) {
        return mJsonCacheManager.getJsonFromDiskCache(url, timeout);
    }

    private String NameValuePair2String(List<NameValuePair> parameters) {
        StringBuilder builder = new StringBuilder();
        for (NameValuePair item : parameters) {
            builder.append(item.getName());
            builder.append("=");
            builder.append(item.getValue());
            builder.append("&");
        }
        builder.deleteCharAt(builder.length() - 1);
        return builder.toString();
    }

    /**
     * 上传图片
     * 
     * @param url
     * @param parameters
     * @param avartarFile
     * @param listener
     */
    public void uploadUserAvartar(final String url, final List<NameValuePair> parameters, final File avartarFile, final IDownloadListener listener) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;
        }

        mExecutorService.execute(new Runnable() {

            @Override
            public void run() {
                uploadUserAvartarByPost(url, parameters, avartarFile, listener);
            }
        });

    }

    protected void uploadUserAvartarByPost(String url, List<NameValuePair> parameters, File avartarFile, IDownloadListener listener) {
        HttpManager.uploadUserAvartar(url, parameters, avartarFile, listener);
    }

    public void uploadMultiPics(final String url, final List<NameValuePair> parameters, final List<String> picsList, final IDownloadListener listener, final boolean fromServer) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;
        }

        mExecutorService.execute(new Runnable() {

            @Override
            public void run() {
                uploadMultiPicsByPost(url, parameters, picsList, listener);
            }
        });

    }

    protected void uploadMultiPicsByPost(String url, List<NameValuePair> parameters, List<String> picsList, IDownloadListener listener) {
        HttpManager.uploadMultiPics(url, parameters, picsList, listener);
    }

    public void loadJsonByJsonPost(String url, List<NameValuePair> parameters, IDownloadListener listener, boolean fromServer) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;

        }

        String json = null;
        String urlParams = url + NameValuePair2String(parameters);
        LogUtil.d(TAG, "url = " + url + "?" + NameValuePair2String(parameters));
        if (!fromServer || XinHaiApplication.mNetworkState == NetWorkUtil.STATE_DISCONNECT) {
            json = getJsonFromCacheFile(urlParams);
            LogUtil.d(TAG, "从cache 中 json " + json);
            if (json != null) {
                if (listener != null) {
                    listener.onDownloadSuccessed(json);
                }
                return;
            }
        }
        json = loadJsonFromServerByHttpPost(url, parameters, listener);
        if (json != null) {
            mJsonCacheManager.addJsonToDiskCache(urlParams, json);
        }
    }

    public void loadJsonByJsonGet(String url, List<NameValuePair> parameters, IDownloadListener listener, boolean fromServer) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;

        }

        String json = null;
        String urlParams = url + NameValuePair2String(parameters);
        LogUtil.d(TAG, "url = " + url + "?" + NameValuePair2String(parameters));
        if (!fromServer || XinHaiApplication.mNetworkState == NetWorkUtil.STATE_DISCONNECT) {
            json = getJsonFromCacheFile(urlParams);
            LogUtil.d(TAG, "从cache 中 json " + json);
            if (json != null) {
                if (listener != null) {
                    listener.onDownloadSuccessed(json);
                }
                return;
            }
        }
        json = loadJsonFromServerByHttpGet(url, parameters, listener);

        if (json != null) {
            mJsonCacheManager.addJsonToDiskCache(urlParams, json);
        }
    }

    public void loadJsonByJsonGet(String url, List<NameValuePair> parameters, IDownloadListener listener, boolean fromServer, long timeout) {
        if (url == null) {
            if (listener != null) {
                listener.onDownloadFailed();
            }
            return;

        }

        String json = null;
        String urlParams = url + NameValuePair2String(parameters);
        LogUtil.d(TAG, "url = " + url + "?" + NameValuePair2String(parameters));
        if (!fromServer || XinHaiApplication.mNetworkState == NetWorkUtil.STATE_DISCONNECT) {
            json = getJsonFromCacheFile(urlParams, timeout);
            LogUtil.d(TAG, "从cache 中 json " + json);
            if (json != null) {
                if (listener != null) {
                    listener.onDownloadSuccessed(json);
                }
                return;
            }
        }
        json = loadJsonFromServerByHttpGet(url, parameters, listener);

        if (json != null) {
            mJsonCacheManager.addJsonToDiskCache(urlParams, json);
        }
    }
}

这是json管理器。 在哪里调用他呢?

这时候我写个类DataManager 在这里调用他

package com.example.net.manager;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import com.example.net.Interface.IDownloadListener;
import com.example.net.config.ApiHttpConfig;
import com.example.net.config.MyParameters;
import com.example.net.utils.LogUtil;

/**
 * 数据管理
 * 
 * @author liuml 2014-2-27
 * 
 */
public class DataManager {
    private static final String TAG = "DataManager";
    // private static DataManager mInstance;
    private JsonManager mJsonManager;

    public DataManager(JsonManager jsonManager) {
        mJsonManager = jsonManager;
    }

    /**
     * 登陆接口
     * 
     * @param username
     *            用户名
     * @param passwd
     *            密码
     * @param imsi
     *            手机imsi
     * @param listener
     *            回调接口
     * @param formServer
     *            是否从服务器上获取(默认为false 如果本地没有数据则从网上获取, 如果为true 则强制从网上获取)
     */
    public void login(String username, String passwd, String imsi, IDownloadListener listener, boolean formServer) {
        String url = ApiHttpConfig.getInstance().loginApi();
        LogUtil.d(TAG, "login url ========================== " + url);
        List<NameValuePair> parameters = MyParameters.getInstance().loginParameters(username, passwd, imsi);
        mJsonManager.loadJsonByPost(url, parameters, listener, formServer);
    }

}

这里我也只是做个登陆接口。其他接口想怎么写就怎么写
对了 还有参数的添加。添加的话需要再写一个类。

package com.example.net.config;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import com.example.net.utils.LogUtil;

public class MyParameters extends ApiHttpConfig{
    private static MyParameters Parameters = new MyParameters();

    public static MyParameters getInstance() {
        return Parameters;
    }

    /**
     * 登陆参数
     * @param username
     * @param passwd
     * @param imsi
     * @return
     */
    public List<NameValuePair> loginParameters(String username, String passwd, String imsi) {

        ArrayList<NameValuePair> parameters = new ArrayList<NameValuePair>();
        if (username == null) {
            username = "";
        }
        if (passwd == null) {
            passwd = "";
        }
        parameters.add(new BasicNameValuePair("username", username));
        parameters.add(new BasicNameValuePair("password", passwd));
        parameters.add(new BasicNameValuePair("imsi", imsi));

        LogUtil.d(TAG + "loginParameters :", parameters.toString());
        return parameters;
    }
}

这个类继承ApiHttpConfig 这个类是用作保存接口的地方

package com.example.net.config;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import com.example.net.utils.LogUtil;

/**
 * 
 * @author liuml
 * 
 *         2015-4-22 上午11:58:11
 */
public class ApiHttpConfig {

    private static ApiHttpConfig apiConfig = new ApiHttpConfig();

    public static final String DefaultParserUrl = "http://192.168.1.1/api/mapi";
    // 登录
    public static final String LOGIN_PART_STRING = "/Login";

    public static final String PARENT_AND_CHILD_REGIST = "/ParentRegist";
    protected static final String TAG = "ApiHttpConfig";

    public static ApiHttpConfig getInstance() {
        return apiConfig;
    }

    public String loginApi() {
        return DefaultParserUrl + LOGIN_PART_STRING;
    }

}

今天就暂时写这么多吧。。ok
里面还有些缓存模块的东西 我明天再加上去吧。。等我全部写完了在吧框架代码发上去

android 从零开始搭建框架系列(1)

标签:开发   android   缓存   框架   

原文地址:http://blog.csdn.net/liudao7994/article/details/45173393

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!