- 浏览: 212236 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
gotosuzhou:
我想问下, 怎么设置汉字 我这个验证码想要有汉字
kaptcha 验证码组件使用简介 -
摸爬滚打NO1:
很好,详细
kaptcha 验证码组件使用简介 -
guodage003:
这是怎么回事?
eclipse提示failed to create JVM -
joefei:
我修改第二个没用,修改了第一个,size为128才可以
eclipse提示failed to create JVM -
tingle:
签名后的,可以吗?
Android APK反编译
在android开发中,经常需要使用数据分页,比如要实现一个新闻列表的显示,或者博文列表的显示,不可能第一次加载就展示出全部,这就需要使用分页的方法来加载数据,在android中Handler经常用来在耗时的工作中,它接收子线程发送的数据,并使用数据配合更新UI,AsyncTask是在一个线程中执行耗时操作然后把结果传给UI线程,不需要你亲自去管理线程和句柄。
一、使用Handler+线程方法
1、基础知识
Handler在android系统中,主要负责发送和接收消息,它的用途主要有以下两种:
(1)按照计划来处理一个消息(sendMessage(Message)方法)或者执行某个runnable实例(post(Runnable)方法)
(2)把其他的线程对象放入消息队列中,避免线程冲突。
消息的发送通过post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int),sendMessage(Message), sendMessageAtTime(Message, long)和 sendMessageDelayed(Message, long) 方法完成。对于postXXX方法通过Runnable对象给消息队列,并在消息队列到达后被调用。对于sendMessageXXX方法,则传递一个包含message对象,该对象可以被Handler类的handlerMessage(Message)方法处理。
2、主要代码
public class HandlerDemo extends Activity implements OnScrollListener { private ListView mListView; LinearLayout loadingLayout; private Thread mThread; private ListViewAdapter adapter; private int startIndex = 1;// 从第1条开始 private int size = 10;// 每次下载十条数据 private List<News> newsList; List<Map<String, String>> data ; /* * 设置布局显示属性 */ private LayoutParams mLayoutParams = new LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); private LayoutParams ffLayoutParams = new LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.news_main); data=new ArrayList<Map<String, String>>(); addView(); } private void addView() { if (startIndex == 1) { newsList = new ArrayList<News>(); newsList = getNewsList(); } getdata(newsList); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.HORIZONTAL); progressBar = new ProgressBar(this); layout.addView(progressBar, mLayoutParams); TextView textView = new TextView(this); textView.setText("加载中..."); textView.setGravity(Gravity.CENTER_VERTICAL); layout.addView(textView, ffLayoutParams); layout.setGravity(Gravity.CENTER); loadingLayout = new LinearLayout(this); loadingLayout.addView(layout, mLayoutParams); loadingLayout.setGravity(Gravity.CENTER); // 得到一个ListView用来显示条目 mListView = (ListView) findViewById(R.id.listView); mListView.addFooterView(loadingLayout); adapter = new ListViewAdapter(); mListView.setAdapter(adapter); mListView.setOnScrollListener(this); mListView.setTextFilterEnabled(true); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // TODO Auto-generated method stub if (firstVisibleItem + visibleItemCount == totalItemCount) { if (mThread == null || !mThread.isAlive()) { mThread = new Thread() { @Override public void run() { newsList = new ArrayList<News>(); newsList = getNewsList(); getdata(newsList); Message msg = new Message(); msg.what = 1; handler.sendMessage(msg); } }; mThread.run(); } } } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub if (msg.what == 1) { startIndex = startIndex + size; Log.v("startindex", startIndex + ""); mListView.removeFooterView(loadingLayout); mThread.stop(); adapter.count += size; adapter.notifyDataSetChanged(); return; } } }; class ListViewAdapter extends BaseAdapter { int count = 10; @Override public int getCount() { // TODO Auto-generated method stub return count; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub convertView = LayoutInflater.from(getApplicationContext()).inflate( R.layout.news_item, null); TextView textView = (TextView) convertView .findViewById(R.id.textNewsTitle); textView.setText((data.get(position)).get("title")); return convertView; } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } private List<Map<String, String>> getdata(List<News> list) { if (list == null) return null; for (News news : list) { Map<String, String> map = new HashMap<String, String>(); map.put("title", news.getTitle()); data.add(map); } return data; } /* * 获取网络数据 注:我是访问本机的一个新闻服务,使用asp.net技术来实现的 * 这个是项目是一个基于android的资讯播报软件 */ private List<News> getNewsList() { String path = "http://10.0.2.2/getNewsList.aspx"; String xmlStr = "<?xml version='1.0' encoding='utf-8'?><source><categoryIds>1,3,7</categoryIds><startIndex>" + startIndex + "</startIndex><detail>2</detail><count>" + size + "</count></source>"; NewsConnector newsConnector = new NewsConnector(); List<News> list = new ArrayList<News>(); list = newsConnector.getNewsList(path, xmlStr); return list; } }
3、小结
ListView使用Handler+线程方式来动态加载数据的步骤如下:
1.先初始化页面(如:加载第一页数据)
2.在接收某个事件的消息之后(以上代码是onScroll事件),启动线程(线程完成下载数据,并发送消息给handler)
3.handler接收到消息后更新界面,显示数据。
二、使用AsyncTask方法
1、基础知识
AsyncTask也是android提供的一个为了不能阻塞主线程的一个类,AsyncTask定义了三种泛型类型Params、Progress和Result,Params启动任务执行输入参数,比如http请求的url和参数,Progress后台执行任务的百分比,后台执行最终返回的结果。
AsyncTask的执行分为四个步骤,每一步都对应都对应一个回调方法,开发者需要实现一个或者几个方法,在任务的执行过程中,这些方法会自动调用。
onPreExecute(),在执行后台耗时操作前被调用,可以在执行此方法中做一些ui操作,比如显示一个进度条等
doInBackground(Params...),这个方法在执行onPreExecute()后执行,这个方法完成耗时工作,比如下载等。
onProgressUpdate(Progress...),UI线程通过此方法获取任务的完成的情况,比如完成的任务的百分比。
onPostExecute(Result),这个方法在耗时工作完成后被调用。UI线程调用此方法获取结果。
注意:在使用AsyncTask类,有几条准则需要遵守
(1)、Task的实例必须在UI线程中创建
(2)、execute方法必须在UI线程中调用
(3)、不要手动调用以上四个方法
(4)、这个任务只执行一次(如果执行第二次将会抛出异常)
2、主要代码
@Override public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub if(arg1+arg2==arg3) { if(!isloading) { new myAsyncTask().execute(null); } else { mListView.removeFooterView(loadingLayout); } } } @Override public void onScrollStateChanged(AbsListView arg0, int arg1) { // TODO Auto-generated method stub } private class myAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub newsList = new ArrayList<News>(); newsList = getNewsList(); getdata(newsList); return null; } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); adapter.count+=size; adapter.notifyDataSetChanged(); startIndex+=size; isloading=false; } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); isloading=true; } }
注:以上仅是和使用Handler+线程方法不同的代码,建议下载源码,了解详细代码
3、小结
ListView使用AsyncTask方法动态加载数据的方法如下:
1.和handler一样初始化页面(如:加载第一页)
2.在接收某个事件的消息之后(以上代码是onScroll事件),创建一个新的异步任务,并开始执行
3.耗时工作完成后,开始更新UI
三、总结
使用Handler+线程和使用AsyncTask方法进行ListView动态加载的比较
Handler+线程方式:
在使用Handler方式时,它涉及Handler、Thread、Message、Looper四个对象,在执行的流程如下:主线程启动一个Thread,这个Thread执行耗时操作,耗时操作完成后,生成一个Message,Looper读取Message并传递给Hander,Handler接收Message并更新响应的UI。因为Looper在一个message处理完,才会读下一条,如果发生多个Message就会形成一个消息队列,所以它对多个后台操作比较清晰,明朗。但对于单个message来讲显得代码比较多,过于复杂。
AsyncTask方式:
AsyncTask继承自Object,是android提供的轻量级的异步类。并提供了一个方法来获取任务的执行进度(可以根据它来更新UI),最后会把结果返回在主线程。这个方式的比较简单,而且可以清楚的看到耗时任务执行的进度。但是对于多个异步操作同时进行,并更新UI变得比较复杂。
- NewsList.zip (88.6 KB)
- 下载次数: 5
发表评论
-
android2.2根据电话号码查询联系人姓名的方法
2012-09-16 23:28 2423public class AndroidTest extend ... -
Android下PopupWindow隐藏及显示(showAtLocation/showAsDropDown)
2012-08-26 00:56 12999上一篇对PopupWindow的用法(位置、动画、焦点)做了详 ... -
Android中PopupWindow的用法(位置、动画、焦点)
2012-08-26 00:54 1984在Android中有很多级别的Window,不同级别的Wind ... -
Color android
2012-08-24 15:07 1130有以下12种常见的颜色: Color.BLACK ... -
【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
2012-08-16 15:03 935在进行UI布局的时候,可能经常会用到 android:g ... -
android ksoap 报错 org.xmlpull.v1.XmlPullParserException: expected: START_TAG 的解决经
2012-08-14 19:47 0在android上 调用webservice出现这个错误 ... -
Android与服务器端数据交互(基于SOAP协议整合android+webservice)
2012-08-14 12:31 1972转自:http://www.open-ope ... -
Android 实现省份城市的选择,并获取城市编号
2012-08-14 00:47 18613该程序主要使用 中央气象局 省份 城市数据库为基础 进行 ... -
让你全面了解SQLite
2012-08-14 00:45 1308一.SQLite的介绍1.SQLite简介SQLite是 ... -
android 模拟器手机如何添加文件到sd卡
2012-08-14 00:05 1318使用android手机模拟器 ... -
Eclipse用svn管理Android项目问题
2012-08-11 15:10 906用svn控制版本,svn本身是不会识别哪些该传,哪些不该 ... -
关于eclipse中关联各版本Android.jar对应的源代码方法
2012-08-11 13:59 946网上看了很多关于在Android APP开发时,将And ... -
深度解析Handler类,以及HandlerThread
2012-08-11 13:43 1294Handler,HandlerThread下次再写;1)核心成 ... -
android在处理一写图片资源
2012-08-09 23:01 7801、Drawable → Bitmap publ ... -
Android用ImageView显示本地和网上的图片
2012-08-09 22:48 5370ImageView是Android程序中经常用到的组件, ... -
Android中LayoutInflater的使用
2012-08-09 18:42 931Inflater英文意思是膨胀,在Android中应该是 ... -
Android模拟器代理设置
2012-08-09 16:03 18028方法一 首先,Windows下,配置Adro ... -
android中ListView控件&&onItemClick点击事件
2012-08-09 15:46 1030转自:http://hi.baidu.com/ilybeen/ ... -
Android 获取设备各种信息以及其它
2012-08-06 14:27 1364做手机开发,想必都希望获取手机号码吧,android中有 ... -
android 安卓APP获取手机设备信息和手机号码的代码示例
2012-08-06 14:26 1742下面我从安卓开发的角度,简单写一下如何获取手机设备信息和 ...
相关推荐
ListView动态加载数据分页,使用Handler+线程和AsyncTask两种方法
在android开发中,经常需要使用数据分页,比如要实现一个新闻列表的显示,或者博文列表的显示,不可能第一次加载就展示出全部,这就需要使用分页的方法来加载数据,在android中Handler经常用来在耗时的工作中,它...
用多线程和AsyncTask两种方式去实现ListView上的网络图片异步加载,其中涉及到到Json的数据解析,根据网络连接获取图片等知识。并添加了缓存机制。
参看文档:http://blog.csdn.net/sinat_29398599/article/details/53169918
listview实现动态加载数据,值得学习
android中listview数据分页加载功能实现
友们在使用ListView的过程中,是否考虑过加载大量的数据时,如何提高显示速度? 朋友你是不是也想对其优化,形成动态加载? 如果你也有过这样的想法,那么我们是同路人! 通过查看ListView的API,我们似乎找不...
Android中使用ListView数据异步加载与AsyncTask,获取网络资源,线程池技术,多线程技术。
Listview分页加载数据.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...
使用AsyncTask去加载json,并通过json里面的Item的Url去加载ListView条目的图片。涉及知识点如下: 1. ListView显示内容 xml布局+adapter 2. 获取网络数据 URLConnection+I/O 3. 解析Json JsonObject+...
Android高级应用源码-Listview分页加载数据.zip
我们在看微博或是到网上商城如淘宝中购物时,每一个商家都会有很多商品,如果把某商家的所有商品都一次性加载过来,会造成手机卡顿,影响用户体验,所以每次加载少量数据,使用分页的形式,分多页加载,会很好的提高...
android listview异步加载图片实例 用到了线程池 下载的图片会保存到本地 并在数据库中保留记录 再次加载时会直接从本地读取
listView 分页加载 android 动态加载数据
AsyncTask_ListView实现加载网络图片例子,主要是初学AsyncTask用例
android 实现listview动态下拉刷新,动态加载数据 可以避免一次数据加载过多
1,通过异步加载,避免阻塞UI线程 2,通过LruCache,将已经下载的图片放到内存中