Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)

时间:2022-10-21 07:42:58

http://blog.csdn.net/banketree/article/details/25589833

简介

一个好的Android应用开发框架,可以加快Android开发速度,今天笔记基于许多开源项目自写了一款Android应用框架。


内容

框架包括:界面管理(Activity管理)、数据库操作(orm框架、加密等)、http交互、缓存管理、下载管理、路径管理、日志输出、网络管理、系统命令、加解密、stl容器、任务管理、奔溃管理、存储管理、其它辅助管理…。


解决思路如下:

界面管理:使用Stack记录Activity的运行轨迹,并在每个Activity添加一个广播处理自定义事件。

[cpp] view plaincopyAndroid比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
  1. private static Stack<Activity> mActivityStack;//进行Activity运行记录  
数据库管理:对数据库的操作要求orm框架、加解密等,采用的是greendao和sqlcrypt开源项目解决。

http交互:实现http交互方式有同步、异步操作。采用的是android-async-http开源项目解决。

缓存管理:实现缓存方式有内存缓存、磁盘缓存。其中内存缓存只针对图片处理,磁盘缓存是针对某目录,实现的方式有:先进先出、最大量、使用频率等。

下载管理:下载管理方式有多线程下载、单线程下载。

路径管理:简单的说就是对程序的目录管理,分图片、视频、音频、缓存目录等。

日志输出:基于Log的管理(分调式、发布模式和文件输出、log输出)。

网络管理:2G、3G、4G等联网方式不同的管理和监听。

系统命令:直接命令运行。

加解密:aes、base64、des、md5等加密方式。

stl容器:重写stl部分容器。

任务管理:基于AsyncTask任务的管理。

奔溃管理:捕捉奔溃信息,并提供发送接口。采用的是acra方法解决。

存储管理:主要是SharedPreferences和Properties的管理。

其它辅助管理:版本、内存、手机格式、字符串操作……等等。


项目如图:

Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)

Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)


效果如图:

Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)+Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)




相关测试代码:

[java] view plaincopyAndroid比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
  1. @Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.test_tree);  
  5.   
  6.     TFilePathManager.getInstance().initConfig(null); // 默认目录(下载�?图片、视频�?缓存等目�?  
  7.                                                         // 优先考虑内存条,其次手机内存�?  
  8. }  
  9.   
  10. public void onClickTestPath(View view) { // 测试路径  
  11.     TFilePathManager.getInstance().initConfig(  
  12.             Environment.getExternalStorageDirectory().getPath()  
  13.                     + File.pathSeparator + "test");  
  14.   
  15.     // 程序目录里面分了图片、缓存区、下载图、音频区、视频区  
  16.     TFilePathManager.getInstance().getAppPath();  
  17.     TFilePathManager.getInstance().getAudioPath();  
  18.     TFilePathManager.getInstance().getCachePath();  
  19.     TFilePathManager.getInstance().getDownloadPath();  
  20.     TFilePathManager.getInstance().getImagePath();  
  21. }  
  22.   
  23. public void onClickTestLog(View view) { // 测试日志  
  24.     TLog.enablePrintToFileLogger(true);  
  25.     for (int i = 0; i < 100; i++)  
  26.         TLog.i(TAG, "123456" + i);  
  27.     // TLog.release(); //关闭程序可释�?  
  28.   
  29.     // 日志是放在程序目录下  
  30.   
  31.     // TLog.enableIgnoreAll(enable);  
  32.     // TLog.enableIgnoreWarn(enable);  
  33. }  
  34.   
  35. public void onClickTestTActivity(View view) { // 测试TActivity  
  36.     Intent intent = new Intent();  
  37.     intent.setClass(this, TestTActivity.class);  
  38.     startActivity(intent);  
  39. }  
  40.   
  41. public void onClickTestHttp1(View view) { // 测试Http1  
  42.     Intent intent = new Intent();  
  43.     intent.setClass(this, TestHttp1.class);  
  44.     startActivity(intent);  
  45. }  
  46.   
  47. public void onClickTestHttp2(View view) { // 测试Http2  
  48.     Intent intent = new Intent();  
  49.     intent.setClass(this, TestHttp2.class);  
  50.     startActivity(intent);  
  51. }  
  52.   
  53. public void onClickTestThreadsdown(View view) { // 测试多线程下载  
  54.     Intent intent = new Intent();  
  55.     intent.setClass(this, TestDowns.class);  
  56.     startActivity(intent);  
  57. }  
  58.   
  59. public void onClickTestCrash(View view) { // 崩溃  
  60.     int result = 1 / 0;  
  61. }  
  62.   
  63. public void onClickTestSqlEncrypt(View view) { // 测试sql加密  
  64.     Intent intent = new Intent();  
  65.     intent.setClass(this, TestSqlEncrypt.class);  
  66.     startActivity(intent);  
  67. }  
  68.   
  69. public void onClickTestDAO(View view) { // 测试orm数据库  
  70.     Intent intent = new Intent();  
  71.     intent.setClass(this, TestDAO.class);  
  72.     startActivity(intent);  
  73. }  
  74.   
  75. public void onClickTestDB(View view) { // 测试Think数据库  
  76.     Intent intent = new Intent();  
  77.     intent.setClass(this, TestDB.class);  
  78.     startActivity(intent);  
  79. }  
  80.   
  81. public void onClickTestCache(View view) { // 测试缓存  
  82.     Intent intent = new Intent();  
  83.     intent.setClass(this, TestCache.class);  
  84.     startActivity(intent);  
  85. }  
  86.   
  87. public void onClickTConfig(View view) { // 测试配置信息  
  88.     TPreferenceConfig.getInstance().initConfig(this);  
  89.     TPropertiesConfig.getInstance().initConfig(this);  
  90.   
  91.     TIConfig iConfig = TPreferenceConfig.getInstance();  
  92.     iConfig.setBoolean("123"true);  
  93.     boolean result = iConfig.getBoolean("123"false);  
  94.   
  95.     iConfig = TPropertiesConfig.getInstance();  
  96.     iConfig.setBoolean("1234"true);  
  97.     result = iConfig.getBoolean("1234"false);  
  98. }  
  99.   
  100. public void onClickEncryption(View view) { // 测试加密  
  101.     String src = "banketree@qq.com";  
  102.     String encrypted = "";  
  103.     String key = "banketree";  
  104.   
  105.     try {  
  106.         encrypted = TAes.encrypt(key, src);  
  107.         String tempString = TAes.decrypt(key, encrypted);  
  108.   
  109.         encrypted = TBase64.encode(src.getBytes());  
  110.         tempString = TBase64.decode(encrypted).toString();  
  111.   
  112.         encrypted = TDes.encrypt(key, src);  
  113.         tempString = TDes.decrypt(key, encrypted);  
  114.         TLog.i(this, tempString);  
  115.     } catch (Exception e) {  
  116.         e.printStackTrace();  
  117.     }  
  118. }  
  119.   
  120. public void onClickZip(View view) { // 测试解压缩  
  121.     try {  
  122.         TCompressUtils.compressJar("");  
  123.         TCompressUtils.compressZip("");  
  124.         TCompressUtils.uncompressJar("");  
  125.         TCompressUtils.uncompressZip("");  
  126.     } catch (Exception e) {  
  127.         e.printStackTrace();  
  128.     }  
  129. }  

奔溃处理回调: [java] view plaincopyAndroid比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
  1. @Override  
  2. public void onAppCrash(String crashFile) {  
  3.   
  4.     TLog.d(TAG, "Creating Dialog for " + crashFile);  
  5.     Intent dialogIntent = new Intent(this, TestCrash.class);  
  6.     dialogIntent.putExtra(TCrash.EXTRA_REPORT_FILE_NAME, crashFile);  
  7.     dialogIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  8.     startActivity(dialogIntent);  
  9. }  


缓存: [java] view plaincopyAndroid比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
  1. mMemoryCacheSize = 2 * 1024 * 1024;// 2M  
  2. mDiscCacheSize = 2 * 1024 * 1024;// 2M  
  3. mDiscCacheFileCount = 100;// 一百个文件  
  4. mMemoryCache = TCacheManager.createLruMemoryCache(mMemoryCacheSize);  
  5.   
  6. try {  
  7.     mDiscCache1 = TCacheManager.createReserveDiscCache(TFilePathManager  
  8.             .getInstance().getCachePath(), "test");  
  9. catch (Exception e) {  
  10.     e.printStackTrace();  
  11. }  
  12.   
  13. try {  
  14.     mDiscCache2 = TCacheManager.createFileCountLimitedDiscCache(  
  15.             mDiscCacheFileCount, TFilePathManager.getInstance()  
  16.                     .getCachePath());  
  17. catch (Exception e) {  
  18.     e.printStackTrace();  
  19. }  

[java] view plaincopyAndroid比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
  1. try {  
  2.             Drawable demo = getResources().getDrawable(R.drawable.ic_launcher);  
  3.             Bitmap bitmap = ((BitmapDrawable) demo).getBitmap();  
  4.             if (arg0 == mTest1Button) {  
  5.                 mMemoryCache.put("123", bitmap);  
  6.                 mMemoryCache.put("1234", bitmap);  
  7.   
  8.                 mMemoryCache.get("123");  
  9.                 mMemoryCache.get("1234");  
  10.             } else if (arg0 == mTest2Button) {  
  11.                 mDiscCache1.put("123", mContext.getCacheDir());  
  12.                 mDiscCache1.get("123");  
  13.             } else if (arg0 == mTest3Button) {  
  14.                 mDiscCache2.put("123", mContext.getCacheDir());  
  15.                 mDiscCache2.get("123");  
  16.             }  
  17.         } catch (Exception e) {  
  18.             makeText(e.getMessage());  
  19.         }  

Activity之间的通信: [java] view plaincopyAndroid比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
  1. @Override  
  2. public void onClick(View arg0) {  
  3.     if (testComparatorButton == arg0) {  
  4.         Log.i("""");  
  5.         UIBroadcast.sentEvent(mContext, 10011002"");  
  6.     }  
  7. }  
  8.   
  9. @Override  
  10. public void processEvent(Intent intent) {  
  11.     super.processEvent(intent);  
  12.     int mainEvent = intent.getIntExtra(UIBroadcast.MAINEVENT, -1); // 主事�?  
  13.     int subEvent = intent.getIntExtra(UIBroadcast.EVENT, -1);// 次事�?  
  14.   
  15.     makeText("哈哈触发�?" + mainEvent + subEvent);// 每个Activity可接收广�?  
  16. }  

Http同步异步请求: [java] view plaincopyAndroid比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
  1. if (view == mCancelButton) {  
  2.     mTAsyncHttpClient.cancelRequests(thistrue);  
  3.     mTAsyncHttpClient.cancelAllRequests(true);  
  4. else if (view == mGetButton) {  
  5.     url = "https://httpbin.org/get";  
  6.     mTAsyncHttpClient.get(url, new AsyncHttpResponseHandler() {  
  7.   
  8.         @Override  
  9.         public void onSuccess(int statusCode, Header[] headers,  
  10.                 byte[] responseBody) {  
  11.             debugHeaders(headers);  
  12.             debugStatusCode(statusCode);  
  13.             debugResponse(new String(responseBody));  
  14.         }  
  15.   
  16.         @Override  
  17.         public void onFailure(int statusCode, Header[] headers,  
  18.                 byte[] responseBody, Throwable error) {  
  19.             debugHeaders(headers);  
  20.             debugStatusCode(statusCode);  
  21.             if (responseBody != null) {  
  22.                 debugResponse(new String(responseBody));  
  23.             }  
  24.   
  25.             TLog.e(this, error.getMessage());  
  26.         }  
  27.   
  28.         @Override  
  29.         public void onProgress(int bytesWritten, int totalSize) {  
  30.             super.onProgress(bytesWritten, totalSize);  
  31.         }  
  32.   
  33.         @Override  
  34.         public void onRetry(int retryNo) {  
  35.             makeText(String.format("Request is retried, retry no. %d",  
  36.                     retryNo));  
  37.         }  
  38.     });  
  39. else if (view == mPostButton) {  
  40.     url = "http://httpbin.org/post";  
  41.     mTAsyncHttpClient.post(mContext, url, getRequestHeaders(),  
  42.             getRequestEntity(), nullnew AsyncHttpResponseHandler() {  
  43.   
  44.                 @Override  
  45.                 public void onStart() {  
  46.                 }  
  47.   
  48.                 @Override  
  49.                 public void onSuccess(int statusCode, Header[] headers,  
  50.                         byte[] response) {  
  51.                     debugHeaders(headers);  
  52.                     debugStatusCode(statusCode);  
  53.                     debugResponse(new String(response));  
  54.                 }  
  55.   
  56.                 @Override  
  57.                 public void onFailure(int statusCode, Header[] headers,  
  58.                         byte[] errorResponse, Throwable e) {  
  59.                     debugHeaders(headers);  
  60.                     debugStatusCode(statusCode);  
  61.                     debugThrowable(e);  
  62.                     if (errorResponse != null) {  
  63.                         debugResponse(new String(errorResponse));  
  64.                     }  
  65.                 }  
  66.             });  
  67.   
  68. else if (view == mPutButton) {  
  69.     url = "http://httpbin.org/put";  
  70.   
  71.     mTAsyncHttpClient.put(this, url, getRequestHeaders(),  
  72.             getRequestEntity(), nullnew AsyncHttpResponseHandler() {  
  73.   
  74.                 @Override  
  75.                 public void onStart() {  
  76.                 }  
  77.   
  78.                 @Override  
  79.                 public void onSuccess(int statusCode, Header[] headers,  
  80.                         byte[] response) {  
  81.                     debugHeaders(headers);  
  82.                     debugStatusCode(statusCode);  
  83.                     debugResponse(new String(response));  
  84.                 }  
  85.   
  86.                 @Override  
  87.                 public void onFailure(int statusCode, Header[] headers,  
  88.                         byte[] errorResponse, Throwable e) {  
  89.                     debugHeaders(headers);  
  90.                     debugStatusCode(statusCode);  
  91.                     debugThrowable(e);  
  92.                     if (errorResponse != null) {  
  93.                         debugResponse(new String(errorResponse));  
  94.                     }  
  95.                 }  
  96.             });  
  97. else if (view == mDeleteButton) {  
  98.     url = "http://httpbin.org/delete";  
  99.   
  100.     mTAsyncHttpClient.delete(this, url, getRequestHeaders(), null,  
  101.             new AsyncHttpResponseHandler() {  
  102.   
  103.                 @Override  
  104.                 public void onStart() {  
  105.                 }  
  106.   
  107.                 @Override  
  108.                 public void onSuccess(int statusCode, Header[] headers,  
  109.                         byte[] response) {  
  110.                     debugHeaders(headers);  
  111.                     debugStatusCode(statusCode);  
  112.                     debugResponse(new String(response));  
  113.                 }  
  114.   
  115.                 @Override  
  116.                 public void onFailure(int statusCode, Header[] headers,  
  117.                         byte[] errorResponse, Throwable e) {  
  118.                     debugHeaders(headers);  
  119.                     debugStatusCode(statusCode);  
  120.                     debugThrowable(e);  
  121.                     if (errorResponse != null) {  
  122.                         debugResponse(new String(errorResponse));  
  123.                     }  
  124.                 }  
  125.             });  
  126. else if (view == mFileButton) {  
  127.     url = "https://httpbin.org/robots.txt";  
  128.   
  129.     mTAsyncHttpClient.get(this, url, getRequestHeaders(), null,  
  130.             new FileAsyncHttpResponseHandler(this) {  
  131.                 @Override  
  132.                 public void onStart() {  
  133.                 }  
  134.   
  135.                 @Override  
  136.                 public void onSuccess(int statusCode, Header[] headers,  
  137.                         File response) {  
  138.                     debugHeaders(headers);  
  139.                     debugStatusCode(statusCode);  
  140.                     debugFile(response);  
  141.                 }  
  142.   
  143.                 @Override  
  144.                 public void onFailure(int statusCode, Header[] headers,  
  145.                         Throwable throwable, File file) {  
  146.                     debugHeaders(headers);  
  147.                     debugStatusCode(statusCode);  
  148.                     debugThrowable(throwable);  
  149.                     debugFile(file);  
  150.                 }  
  151.   
  152.                 private void debugFile(File file) {  
  153.                     if (file == null || !file.exists()) {  
  154.                         debugResponse("Response is null");  
  155.                         return;  
  156.                     }  
  157.                     try {  
  158.                         debugResponse(file.getAbsolutePath()  
  159.                                 + "\r\n\r\n"  
  160.                                 + TFileUtils.getStringFromFile(file));  
  161.                     } catch (Throwable t) {  
  162.                         TLog.e(TAG,  
  163.                                 "Cannot debug file contents"  
  164.                                         + t.getMessage());  
  165.                     }  
  166.                     if (!deleteTargetFile()) {  
  167.                         TLog.d(TAG, "Could not delete response file "  
  168.                                 + file.getAbsolutePath());  
  169.                     }  
  170.                 }  
  171.             });  
  172. else if (view == mGZipButton) {  
  173.     url = "http://httpbin.org/gzip";  
  174.     mTAsyncHttpClient.get(this, url, nullnull,  
  175.             new BaseJsonHttpResponseHandler<SampleJSON>() {  
  176.   
  177.                 @Override  
  178.                 public void onStart() {  
  179.                 }  
  180.   
  181.                 @Override  
  182.                 public void onSuccess(int statusCode, Header[] headers,  
  183.                         String rawJsonResponse, SampleJSON response) {  
  184.                     debugHeaders(headers);  
  185.                     debugStatusCode(statusCode);  
  186.                     if (response != null) {  
  187.                         debugResponse(rawJsonResponse);  
  188.                     }  
  189.                 }  
  190.   
  191.                 @Override  
  192.                 public void onFailure(int statusCode, Header[] headers,  
  193.                         Throwable throwable, String rawJsonData,  
  194.                         SampleJSON errorResponse) {  
  195.                     debugHeaders(headers);  
  196.                     debugStatusCode(statusCode);  
  197.                     debugThrowable(throwable);  
  198.                     if (errorResponse != null) {  
  199.                         debugResponse(rawJsonData);  
  200.                     }  
  201.                 }  
  202.   
  203.                 @Override  
  204.                 protected SampleJSON parseResponse(String rawJsonData,  
  205.                         boolean isFailure) throws Throwable {  
  206.                     return null;  
  207.                     // return new ObjectMapper().readValues(  
  208.                     // new JsonFactory().createParser(rawJsonData),  
  209.                     // SampleJSON.class).next();  
  210.                 }  
  211.   
  212.             });  
  213.   
  214. else if (view == mRedirect302Button) {  
  215.     url = "http://httpbin.org/redirect/6";  
  216.   
  217.     HttpClient client = mTAsyncHttpClient.getHttpClient();  
  218.     if (client instanceof DefaultHttpClient) {  
  219.         // enableRedirects/enableRelativeRedirects/enableCircularRedirects  
  220.         mTAsyncHttpClient.setEnableRedirects(truetruetrue);  
  221.     }  
  222.   
  223.     mTAsyncHttpClient.get(url, new AsyncHttpResponseHandler() {  
  224.   
  225.         @Override  
  226.         public void onSuccess(int statusCode, Header[] headers,  
  227.                 byte[] responseBody) {  
  228.             debugHeaders(headers);  
  229.             debugStatusCode(statusCode);  
  230.             debugResponse(new String(responseBody));  
  231.         }  
  232.   
  233.         @Override  
  234.         public void onFailure(int statusCode, Header[] headers,  
  235.                 byte[] responseBody, Throwable error) {  
  236.             debugHeaders(headers);  
  237.             debugStatusCode(statusCode);  
  238.             if (responseBody != null) {  
  239.                 debugResponse(new String(responseBody));  
  240.             }  
  241.   
  242.             TLog.e(this, error.getMessage());  
  243.         }  
  244.   
  245.         @Override  
  246.         public void onProgress(int bytesWritten, int totalSize) {  
  247.             super.onProgress(bytesWritten, totalSize);  
  248.         }  
  249.   
  250.         @Override  
  251.         public void onRetry(int retryNo) {  
  252.             makeText(String.format("Request is retried, retry no. %d",  
  253.                     retryNo));  
  254.         }  
  255.     });  
  256. else if (view == mJsonButton) {  
  257.     url = "http://httpbin.org/headers";  
  258.   
  259.     mTAsyncHttpClient.get(this, url, nullnull,  
  260.             new BaseJsonHttpResponseHandler<SampleJSON>() {  
  261.   
  262.                 @Override  
  263.                 public void onStart() {  
  264.                 }  
  265.   
  266.                 @Override  
  267.                 public void onSuccess(int statusCode, Header[] headers,  
  268.                         String rawJsonResponse, SampleJSON response) {  
  269.                     debugHeaders(headers);  
  270.                     debugStatusCode(statusCode);  
  271.                     if (response != null) {  
  272.                         debugResponse(rawJsonResponse);  
  273.                     }  
  274.                 }  
  275.   
  276.                 @Override  
  277.                 public void onFailure(int statusCode, Header[] headers,  
  278.                         Throwable throwable, String rawJsonData,  
  279.                         SampleJSON errorResponse) {  
  280.                     debugHeaders(headers);  
  281.                     debugStatusCode(statusCode);  
  282.                     debugThrowable(throwable);  
  283.                     if (errorResponse != null) {  
  284.                         debugResponse(rawJsonData);  
  285.                     }  
  286.                 }  
  287.   
  288.                 @Override  
  289.                 protected SampleJSON parseResponse(String rawJsonData,  
  290.                         boolean isFailure) throws Throwable {  
  291.                     return null;  
  292.                     // return new ObjectMapper().readValues(  
  293.                     // new JsonFactory().createParser(rawJsonData),  
  294.                     // SampleJSON.class).next();  
  295.                 }  
  296.   
  297.             });  
  298. else if (view == mLoginButton) {  
  299.     url = "http://myendpoint.com";  
  300.     RequestParams params = new RequestParams();  
  301.     params.put("username""banketree");  
  302.     params.put("password""111111");  
  303.     params.put("email""banketree@qq.com");  
  304.     // params.put("profile_picture", new File("pic.jpg")); // Upload a  
  305.     // File  
  306.     // params.put("profile_picture2", someInputStream); // Upload  
  307.     // anInputStream  
  308.     // map = new HashMap<String, String>();  
  309.     // map.put("first_name", "James");  
  310.     // map.put("last_name", "Smith");  
  311.     // params.put("user", map);  
  312.     // * Set<String> set = new HashSet<String>(); //  
  313.     // unordered collection  
  314.     // * set.add("music");  
  315.     // * set.add("art");  
  316.     // * params.put("like", set); // url params:  
  317.     // "like=music&like=art"  
  318.     //  
  319.     // * List<String> list = new ArrayList<String>(); //  
  320.     // Ordered collection  
  321.     // * list.add("Java");<>  
  322.     // * list.add("C");  
  323.     // * params.put("languages", list); // url params:  
  324.     // "languages[]=Java&languages[]=C"  
  325.     //  
  326.     // * String[] colors = { "blue", "yellow" }; // Ordered collection  
  327.     // * params.put("colors", colors); // url params:  
  328.     // "colors[]=blue&colors[]=yellow"  
  329.     // *  
  330.     // * List<Map<String, String>> listOfMaps = new  
  331.     // ArrayList<Map<String,  
  332.     // * String>>();  
  333.     // * Map<String, String> user1 = new HashMap<String,  
  334.     // String>();  
  335.     // * user1.put("age", "30");  
  336.     // * user1.put("gender", "male");  
  337.     // * Map<String, String> user2 = new HashMap<String,  
  338.     // String>();  
  339.     // * user2.put("age", "25");  
  340.     // * user2.put("gender", "female");  
  341.     // * listOfMaps.add(user1);  
  342.     // * listOfMaps.add(user2);  
  343.     // * params.put("users", listOfMaps); // url params:  
  344.     // "users[][age]=30&users[][gender]=male&users[][age]=25&users[][gender]=female"  
  345.     // *  
  346.   
  347.     mTAsyncHttpClient.post(url, params, new AsyncHttpResponseHandler() {  
  348.   
  349.         @Override  
  350.         public void onStart() {  
  351.         }  
  352.   
  353.         @Override  
  354.         public void onSuccess(int statusCode, Header[] headers,  
  355.                 byte[] response) {  
  356.             debugHeaders(headers);  
  357.             debugStatusCode(statusCode);  
  358.             debugResponse(new String(response));  
  359.         }  
  360.   
  361.         @Override  
  362.         public void onFailure(int statusCode, Header[] headers,  
  363.                 byte[] errorResponse, Throwable e) {  
  364.             debugHeaders(headers);  
  365.             debugStatusCode(statusCode);  
  366.             debugThrowable(e);  
  367.             if (errorResponse != null) {  
  368.                 debugResponse(new String(errorResponse));  
  369.             }  
  370.         }  
  371.     });  
  372. else if (view == mBinaryButton) {  
  373.     url = "http://httpbin.org/gzip";  
  374.   
  375.     mTAsyncHttpClient.get(this, url, getRequestHeaders(), null,  
  376.             new BinaryHttpResponseHandler() {  
  377.                 @Override  
  378.                 public void onStart() {  
  379.                 }  
  380.   
  381.                 @Override  
  382.                 public String[] getAllowedContentTypes() {  
  383.                     // Allowing all data for debug purposes  
  384.                     return new String[] { ".*" };  
  385.                 }  
  386.   
  387.                 public void onSuccess(int statusCode, Header[] headers,  
  388.                         byte[] binaryData) {  
  389.                     debugStatusCode(statusCode);  
  390.                     debugHeaders(headers);  
  391.                     debugResponse("Received response is "  
  392.                             + binaryData.length + " bytes");  
  393.                 }  
  394.   
  395.                 @Override  
  396.                 public void onFailure(int statusCode, Header[] headers,  
  397.                         byte[] errorResponse, Throwable e) {  
  398.                     debugHeaders(headers);  
  399.                     debugStatusCode(statusCode);  
  400.                     debugThrowable(e);  
  401.                     if (errorResponse != null) {  
  402.                         debugResponse("Received response is "  
  403.                                 + errorResponse.length + " bytes");  
  404.                     }  
  405.                 }  
  406.             });  
  407. else if (view == mSynGetButton) {  
  408.     url = "https://httpbin.org/delay/6";  
  409.   
  410.     mTSyncHttpClient.get(this, url, getRequestHeaders(), null,  
  411.             new AsyncHttpResponseHandler() {  
  412.   
  413.                 @Override  
  414.                 public void onStart() {  
  415.                 }  
  416.   
  417.                 @Override  
  418.                 public void onSuccess(final int statusCode,  
  419.                         final Header[] headers, final byte[] response) {  
  420.                     debugHeaders(headers);  
  421.                     debugStatusCode(statusCode);  
  422.                     debugResponse(new String(response));  
  423.                 }  
  424.   
  425.                 @Override  
  426.                 public void onFailure(final int statusCode,  
  427.                         final Header[] headers,  
  428.                         final byte[] errorResponse, final Throwable e) {  
  429.                     debugHeaders(headers);  
  430.                     debugStatusCode(statusCode);  
  431.                     debugThrowable(e);  
  432.                     if (errorResponse != null) {  
  433.                         debugResponse(new String(errorResponse));  
  434.                     }  
  435.                 }  
  436.             });  
  437. else if (view == mTimeOutButton) {  
  438.     url = "http://httpbin.org/delay/6";  
  439.   
  440.     mTAsyncHttpClient.get(this, url, getRequestHeaders(), null,  
  441.             new AsyncHttpResponseHandler() {  
  442.                 private int counter = 0;  
  443.                 private int id = counter++;  
  444.                 private SparseArray<String> states = new SparseArray<String>();  
  445.   
  446.                 @Override  
  447.                 public void onStart() {  
  448.                     setStatus(id, "START");  
  449.                 }  
  450.   
  451.                 @Override  
  452.                 public void onSuccess(int statusCode, Header[] headers,  
  453.                         byte[] responseBody) {  
  454.                     setStatus(id, "SUCCESS");  
  455.                 }  
  456.   
  457.                 @Override  
  458.                 public void onFinish() {  
  459.                     setStatus(id, "FINISH");  
  460.                 }  
  461.   
  462.                 @Override  
  463.                 public void onFailure(int statusCode, Header[] headers,  
  464.                         byte[] responseBody, Throwable error) {  
  465.                     setStatus(id, "FAILURE");  
  466.                 }  
  467.   
  468.                 @Override  
  469.                 public void onCancel() {  
  470.                     setStatus(id, "CANCEL");  
  471.                 }  
  472.   
  473.                 private synchronized void setStatus(int id,  
  474.                         String status) {  
  475.                     String current = states.get(id, null);  
  476.                     states.put(id, current == null ? status : current  
  477.                             + "," + status);  
  478.                     for (int i = 0; i < states.size(); i++) {  
  479.                         debugResponse(String.format("%d (from %d): %s",  
  480.                                 states.keyAt(i), counter,  
  481.                                 states.get(states.keyAt(i))));  
  482.                     }  
  483.                 }  
  484.             });  
  485. }  


结束

此框架参考了ThinkAndroid,在写此项目之前,笔者一直使用ThinkAndroid框架开发项目,所以很多思想来源于此。Think框架介绍如下:

ThinkAndroid是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行Android应用程序的开发,包含Android mvc、简易sqlite orm、ioc模块、封装Android httpclitent的http模块,具有快速构建文件缓存功能,无需考虑缓存文件的格式,都可以非常轻松的实现缓存,它还基于文件缓存模块实现了图片缓存功能,在android中加载的图片的时候,对oom的问题,和对加载图片错位的问题都轻易解决。他还包括了一个手机开发中经常应用的实用工具类,如日志管理,配置文件管理,android下载器模块,网络切换检测等等工具。 

下载地址:https://github.com/white-cat/ThinkAndroid


项目下载