天天看点

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

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

简介

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

内容

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

解决思路如下:

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

[cpp] view plain copy

Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
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 plain copy

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

奔溃处理回调: [java] view plain copy

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

缓存: [java] view plain copy

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

[java] view plain copy

Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
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.                 mMemoryCache.get("123");  
  8.                 mMemoryCache.get("1234");  
  9.             } else if (arg0 == mTest2Button) {  
  10.                 mDiscCache1.put("123", mContext.getCacheDir());  
  11.                 mDiscCache1.get("123");  
  12.             } else if (arg0 == mTest3Button) {  
  13.                 mDiscCache2.put("123", mContext.getCacheDir());  
  14.                 mDiscCache2.get("123");  
  15.             }  
  16.         } catch (Exception e) {  
  17.             makeText(e.getMessage());  
  18.         }  

Activity之间的通信: [java] view plain copy

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

Http同步异步请求: [java] view plain copy

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

结束

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

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

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

项目下载

继续阅读