最近再找好用的异步http通信库,在OSC上找到一款功能强大的android轻量级辅助库android query,支持view的绑定,链式调用,http通信,网页或本地图片的异步加载,以及强大的cahe功能,当然还有更多的细节可以到Google Source的页面上查看:https://code.google.com/p/android-query/

但是在异步操作显示进度上有些不完善,例如只支持progressbar的绑定,不能动态获得进度,我觉得在很多场合上动态地获得进度更加灵活,所以在android query的代码上修改了一下,加入了OnProgressListener类,没有用接口是因为不能绑定数据,没有通过继承来绑定数据和调用方法那么方便。

具体修改的代码:

//com.androidquery.util  Progress.javapackage com.androidquery.util;import android.app.Activity;import android.app.ProgressDialog;import android.view.View;import android.widget.ProgressBar;import com.androidquery.AQuery;public class Progress implements Runnable{private ProgressBar pb;private ProgressDialog pd;private Activity act;private View view;private OnProgressListener listener;private boolean unknown;private int bytes;private int current;private String url;public Progress(Object p){if(p instanceof ProgressBar){pb = (ProgressBar) p;}else if(p instanceof ProgressDialog){pd = (ProgressDialog) p;}else if(p instanceof Activity){act = (Activity) p;}else if(p instanceof View){view = (View) p;}else if (p  instanceof OnProgressListener){listener = (OnProgressListener) p;}}public void reset(){if(pb != null){pb.setProgress(0);pb.setMax(10000);}if(pd != null){pd.setProgress(0);pd.setMax(10000);}if(act != null){act.setProgress(0);}if(listener != null){listener.onProgress(unknown, bytes, current);}unknown = false;current = 0;bytes = 10000;}public void setBytes(int bytes){if(bytes <= 0){unknown = true;bytes = 10000;}this.bytes = bytes;if(pb != null){pb.setProgress(0);pb.setMax(bytes);}if(pd != null){pd.setProgress(0);pd.setMax(bytes);}if(listener != null) {listener.onProgress(unknown, bytes, current);}}public void increment(int delta){if(pb != null){pb.incrementProgressBy(unknown ? 1 : delta);}if(pd != null){pd.incrementProgressBy(unknown ? 1 : delta);}if(act != null){int p;if(unknown){p = current++;}else{current+= delta;p = (10000 * current) / bytes;}if(p > 9999){p = 9999;}act.setProgress(p);}if(listener != null) {if(!unknown)current += delta;listener.onProgress(unknown, bytes, current);}}public void done(){if(pb != null){pb.setProgress(pb.getMax());}if(pd != null){pd.setProgress(pd.getMax());}if(act != null){act.setProgress(9999);}if(listener != null) {listener.onProgress(unknown, bytes, bytes);}}@Overridepublic void run() {dismiss(url);}public void show(String url){reset();if(pd != null){AQuery aq = new AQuery(pd.getContext());aq.show(pd);}if(act != null){act.setProgressBarIndeterminateVisibility(true);act.setProgressBarVisibility(true);}if(pb != null){pb.setTag(AQuery.TAG_URL, url);pb.setVisibility(View.VISIBLE);}if(view != null){view.setTag(AQuery.TAG_URL, url);view.setVisibility(View.VISIBLE);}}public void hide(String url){if(AQUtility.isUIThread()){dismiss(url);}else{this.url = url;AQUtility.post(this);}}private void dismiss(String url){if(pd != null){AQuery aq = new AQuery(pd.getContext());aq.dismiss(pd);}if(act != null){act.setProgressBarIndeterminateVisibility(false);act.setProgressBarVisibility(false);}if(pb != null){pb.setTag(AQuery.TAG_URL, url);pb.setVisibility(View.VISIBLE);}View pv = pb;if(pv == null){pv = view;}if(pv != null){Object tag = pv.getTag(AQuery.TAG_URL);if(tag == null || tag.equals(url)){pv.setTag(AQuery.TAG_URL, null);if(pb != null && pb.isIndeterminate()){pv.setVisibility(View.GONE);}}}}}//在util包内新增 OnProgressListener.javapackage com.androidquery.util;public abstract class OnProgressListener {public abstract void onProgress(boolean unknown, int total_bytes, int current);}

导出jar后就可以使用了,例如:

class MyOnProgressListener extends OnProgressListener {private XMLData xd;public MyOnProgressListener(XMLData _xd) {xd = _xd;}@Overridepublic void onProgress(boolean unknown, int total_bytes, int current) {if(!unknown && total_bytes!=0)xd.downlad_progress = current*100/total_bytes;elsexd.downlad_progress = 0;View parent = ((View)xd.getTag(0));if(parent.getTag() == xd) {ProgressBar pb = (ProgressBar)parent.findViewById(R.id.ih_progressBar);pb.setProgress(xd.downlad_progress);pb.setVisibility(View.VISIBLE);my_handler.sendMsg(xd);TextView tv = (TextView)parent.findViewById(R.id.ih_progressBar_text);tv.setVisibility(View.VISIBLE);parent.findViewById(R.id.ih_info).setVisibility(View.INVISIBLE);}if(MyData.d.get().a_downloadlist != null) {parent = ((View)xd.getTag(1));if(parent != null && parent.getTag() == xd) {ProgressBar pb = (ProgressBar)parent.findViewById(R.id.ih_progressBar);pb.setProgress(xd.downlad_progress);pb.setVisibility(View.VISIBLE);my_handler.sendMsg(xd);TextView tv = (TextView)parent.findViewById(R.id.ih_progressBar_text);tv.setVisibility(View.VISIBLE);parent.findViewById(R.id.ih_info).setVisibility(View.INVISIBLE);}}}}

android query的其他特性我在这里就不解释了,官网上都有详细说明,之前我也看过国内类似的开源库androidfinal(afinal),虽然某些方面确实方便一些,但是比起android query来说确实有很多地方还需要改进,而且感觉是跟风android query,名字也起得稍微有些太霸气了(并非批评),不过我还是会持续关注afinal的,支持国产!

更多相关文章

  1. Android笔记:Android(安卓)UI学习 - 对话框 (AlertDialog & Progr
  2. android之Android中的SQL查询语句LIKE绑定参数问题解决办法(sqlit
  3. Android开发利器之Data Binding Compiler V2,databind和livedata
  4. Android(安卓)自定义圆形进度条 带刻度进度条 计步效果 时速表
  5. XUtils-Android(安卓)最火的快速开发框架
  6. Android_Servcie_后台服务总结笔记
  7. Android学习笔记:常用控件 RadioGroup和CheckBox
  8. Android标题栏进度指示器使用方法
  9. Android入门第一篇[转]

随机推荐

  1. Android MapView 申请apiKey
  2. 调整 FMX Android 文字显示「锯齿」效果
  3. 如何在android中实现圆角显示
  4. Android 的补间动画
  5. Android桌面组件开发之桌面快捷方式(一)
  6. 让Android Studio支持系统签名(证书)
  7. Android 系统启动过程
  8. 金三银四背后,一个 Android(安卓)程序员从
  9. Android Studio(八):Android Studio设置教
  10. 暂时遗忘OSGi,让我们去品味一杯android磨