Android 实现界面刷新的几种pyqt5 方法 刷新 界面

Android几种强大的下拉刷新库
BeautifulRefreshLayout众多优秀的下拉刷新(除了我写的之外T_T)
说起下拉刷新,好像经历一段历史的洗礼。。。
(1)在我刚学android的时候,用的是XListView,在github上搜索有 MarkMjw/PullToRefresh,根据Maxwin的XListView改造而来,完善下拉刷新上拉加载更多的功能并实现自动刷新以及自动加载等功能, 并增加对ScrollView的支持。 原XListView参考链接: https://github.com/Maxwin-z/XListView-Android(听说原作者停
(2)然后又学了 chrisbanes/Android-PullToRefresh的那个库,这个库牛逼到要死,支持ListView、ExpandableListView、GridView、WebView、ScrollView、HorizontalScrollView、ViewPager、ListFragment、、、
自己也侮辱了这个库,改的乱七八糟 https://github.com/android-cjj/ComicReader/tree/master/YinHunPulltoRefreshLibrary,增加了支持瀑布流刷新的功能和下拉动画效果的。。。。
(3)那时候看了知乎的客户端,下拉刷新很炫,查了下是用什么实现的,最终知道是用 chrisbanes/ActionBar-PullToRefresh的库可以实现那种效果,又去学了,啊哈哈,然而过些日子也没见人用了,啊哈哈哈
(4)这时候google也有自己的下拉控件SwipeRefreshLayout,刚出来的效果,一条加载直线,个人觉得,一般到要死。 stormzhang/SwipeRefreshLayoutDemo写了demo。
android 5.0之后效果是个加载圆圈,还可以接受了,现在很多应用都用这个
(5)这时又看到了 baoyongzhang/android-PullRefreshLayout,This component like SwipeRefreshLayout, it is more beautiful than SwipeRefreshLayout.就是比google的跟漂亮。呵呵!
(6)同时,这里也要提下 liaohuqiu/android-Ultra-Pull-To-Refresh,已经强大到什么控件都能适用刷新了,相信你也听过了
[图片上传失败...(image-)]
(7)看过最有创意的下拉刷新FlyRefresh,一只飞机飞啊飞,然而并没有什么卵用…..
(8)material设计已经深入到开发者的心里,然后 我看到了A pull-down-to-refresh layout inspired by Lollipop overscrolled effects allan1st/JellyRefreshLayout,我这个也是看人家的代码实现的,十分感谢,啊哈哈
(9)最近看的下拉刷新也是挺奇怪的,就比如 recruit-lifestyle/BeerSwipeRefresh啤酒下拉刷新和 recruit-lifestyle/WaveSwipeRefreshLayout水滴下拉刷新…
(10)这个是网友推荐的 SuperSwipeRefreshLayout,顾名思义,是扩展自SwipeRefreshLayout。
(11)这个是Yalantis公司开发的下拉刷新,其中它的很多东西动画这块,做的非常漂亮Yalantis/Phoenix
Taurus又是飞机飞啊飞…
(12) tuesda/CircleRefreshLayout的下拉刷新,动画做的很不错,设计图来源 https://dribbble.com/shots/1797373-Pull-Down-To-Refresh
(13) BeautifulRefreshLayoutForFood
看到一个很漂亮的美食下拉刷新 (来源地址),可惜技术水平菜菜的,只能模仿一下下,啊哈哈。。。源码下载地址download
[图片上传失败...(image-ea20fa-2)]
(14) BeautifulRefreshLayoutForNaruto
闲着蛋疼,写了个血轮眼下拉刷新的,虽然火影漫画完结了,但是动画还在继续,真的是挂漫天飞。。。。
(15) bingoogolapple/BGARefreshLayout-Android多种下拉刷新效果、上拉加载更多、可配置自定义头部广告位…
(16) BeautifulRefreshLayoutForGirl
这是一个小清新的下拉刷新,纯代码绘制,无需任何图片,Recyclerview中item展示的妹子图来自 http://gank.io/
设计图来源,当然我实现的效果做了一些修改,希望你喜欢,呵呵。。。源码下载地址download pull to refresh by Michael Lanning
截图(17) BeautifulRefreshLayoutForRain这是一个下雨刷新,你没听错,确实一刷新就下雨,为什么会出现,只是我的好奇心而做的东西,见怪不怪了,呵呵。。。
(18) Android-MaterialRefreshLayout是我最近写的, it is more beautiful and powerful than SwipeRefreshLayout , 下拉刷新拥有侵入式,非侵入式,覆盖式,非覆盖式,自动刷新,上拉加载更多,自动加载等功能……
(19) WaveRefreshForAndroid这个是基于 Android-PullToRefresh修改的而成的水波纹下拉刷新…可能作者主攻ios,所以ios的效果看起来好看点WaveRefresh…
(20)WaterDropListView如果你用过ios的qq,那应该很熟悉这种刷新了,效果还是蛮不错的,就是不知道为什么android版本的qq不用,呵呵。。。
(21) SwipeRefreshRecyclerView一个展示 RecyclerView 下拉刷新和上拉加载更多的 Demo 完全使用原生控件实现非侵入式的下拉刷新和加载更多。 同时也是 Ailurus 练习 RxJava 的小例子。 使用HeaderViewRecyclerAdapter完成了加载更多的进度展示
(22)阿拉灯神灯写的两个下拉库 AutoHomeRefreshListView仿汽车之家下拉刷新和 MeiTuanRefreshListView仿美团下拉刷新。。。
(23)XRecyclerViewa RecyclerView that implements pullrefresh and loadingmore featrues.you can use it like a standard RecyclerView
(24) ChromeLikeSwipeLayout这个效果蛮赞的,细节做的很好。。。。Pull down, and execute more action!
(25)下拉玩消格子游戏HitBlockRefresh, 一边下拉刷新,一边打砖块.
温馨提示:如需RecyclerView加载更多,请参考: https://github.com/android-cjj/Android-RecyclerViewWithFooter
如果有好的下拉刷新的可以和我一块交流
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点没有更多推荐了,
不良信息举报
举报内容:
Android 中几种更新UI界面的方法
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!之前做过一个Android采集心电图数据的程序,那才是真正的多线程,之前写的小程序:比如下载个文件,从socket接受大一点的数据流然后在ui上更新进度,我都感觉这就叫做多线程了,其实这啥都不算,用个handler就解决问题了。而当你采集的时候情况就不同了,首先你要从硬件驱动中读取数据,另外数据需要缓存,缓存的同时还要将数据发送到远程服务器,另外还得将数据进行跳帧处理,以方便设备的屏幕上显示起来不那么卡,还要不断的更新ui界面上的绘图。起初的时候对这一连串的多线程真的是弄得手忙脚乱,后来才发现更新ui界面原来不只有handler一种方式,还有其他的,下面就总结如下:
1.利用Looper更新UI界面
这就是我们常用的handler方式
&在Main主线程中新开一个线程,该线程负责数据的更新,然后将更新后的数据放在Message里面,然后通过Handler传递给相应的UI进行更新。
public class MainActivity extends Activity {
private Button mB
private TextView mT
@SuppressLint("HandlerLeak")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)this.findViewById(R.id.button);
mText = (TextView)this.findViewById(R.id.text);
final Handler handler = new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what == 1){
mText.setText("更新后");
mText.setText("更新前");
final Thread thread = new Thread(new Runnable(){
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
thread.start();
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
Handler的工作机制。
&&&&& Handler的作用就是两个:在新启动的线程中发送消息和在主线程中获取和处理消息。像是上面例子中的Handler就包含了这两个方面:我们在新启动的线程thread中调用Handler的sendMessage()方法来发送消息。发送给谁呢?从代码中可以看到,就发送给主线程创建的Handler中的handleMessage()方法处理。这就是回调的方式:我们只要在创建Handler的时候覆写handleMessage()方法,然后在新启动的线程发送消息时自动调用该方法。
2.AsyncTask利用线程任务异步更新UI界面
AsyncTask的原理和Handler很接近,都是通过往主线程发送消息来更新主线程的UI,这种方式是异步的,所以就叫AsyncTask。使用AsyncTask的场合像是下载文件这种会严重阻塞主线程的任务就必须放在异步线程里面:
1 public class MainActivity extends Activity {
private Button mB
private ImageView mImageV
private ProgressBar mProgressB
@SuppressLint("HandlerLeak")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) this.findViewById(R.id.button);
mImageView = (ImageView) this.findViewById(R.id.image);
mProgressBar = (ProgressBar) this.findViewById(R.id.progressBar);
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
AsyncTaskThread thread = new AsyncTaskThread();
thread.execute("http://g.search2.alicdn.com/img/bao/uploaded/i4/"
+ "i4/53897/T1dahpFapbXXXXXXXX_!!0-item_pic.jpg_210x210.jpg");
class AsyncTaskThread extends AsyncTask&String, Integer, Bitmap& {
protected Bitmap doInBackground(String... params) {
publishProgress(0);
HttpClient client = new DefaultHttpClient();
publishProgress(30);
HttpGet get = new HttpGet(params[0]);
HttpResponse response = client.execute(get);
bitmap = BitmapFactory.decodeStream(response.getEntity()
.getContent());
} catch (Exception e) {
return null;
publishProgress(100);
protected void onProgressUpdate(Integer... progress) {
mProgressBar.setProgress(progress[0]);
protected void onPostExecute(Bitmap result) {
if (result != null) {
Toast.makeText(MainActivity.this, "成功获取图片", Toast.LENGTH_LONG)
mImageView.setImageBitmap(result);
Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG)
protected void onPreExecute() {
mImageView.setImageBitmap(null);
mProgressBar.setProgress(0);
protected void onCancelled() {
mProgressBar.setProgress(0);
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
AsyncTask是为了方便编写后台线程与UI线程交互的辅助类,它的内部实现是一个线程池,每个后台任务会提交到线程池中的线程执行,然后通过向UI线程的Handler传递消息的方式调用相应的回调方法实现UI界面的更新。
&&&&&AsyncTask的构造方法有三个模板参数:Params(传递给后台任务的参数类型),Progress(后台计算执行过程中,进度单位(progress units)的类型,也就是后台程序已经执行了百分之几)和Result(后台执行返回的结果的类型)。
1 protected Bitmap doInBackground(String... params) {
publishProgress(0);
HttpClient client = new DefaultHttpClient();
publishProgress(30);
HttpGet get = new HttpGet(params[0]);
HttpResponse response = client.execute(get);
bitmap = BitmapFactory.decodeStream(response.getEntity()
.getContent());
} catch (Exception e) {
return null;
publishProgress(100);
params是一个可变参数列表,publishProgress()中的参数就是Progress,同样是一个可变参数列表,它用于向UI线程提交后台的进度,这里我们一开始设置为0,然后在30%的时候开始获取图片,一旦获取成功,就设置为100%。中间的代码用于下载和获取网上的图片资源
protected void onProgressUpdate(Integer... progress) {
mProgressBar.setProgress(progress[0]);
&onProgressUpdate()方法用于更新进度条的进度。
1 protected void onPostExecute(Bitmap result) {
if (result != null) {
Toast.makeText(MainActivity.this, "成功获取图片", Toast.LENGTH_LONG).show();
mImageView.setImageBitmap(result);
Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG).show();
&onPostExecute()方法用于处理Result的显示,也就是UI的更新。
protected void onPreExecute() {
mImageView.setImageBitmap(null);
mProgressBar.setProgress(0);
protected void onCancelled() {
mProgressBar.setProgress(0);
&这两个方法主要用于在执行前和执行后清空图片和进度。&&&&& 最后我们只需要调用AsyncTask的execute()方法并将Params参数传递进来进行。完整的流程是这样的:
&&&&& UI线程执行onPreExecute()方法把ImageView的图片和ProgressBar的进度清空,然后后台线程执行doInBackground()方法,千万不要在这个方法里面更新UI,因为此时是在另一条线程上,在使用publishProgress()方法的时候会调用onProgressUpdate()方法更新进度条,最后返回result---Bitmap,当后台任务执行完成后,会调用onPostExecute()方法来更新ImageView。
&&&&& AsyncTask本质上是一个静态的线程池,由它派生出来的子类可以实现不同的异步任务,但这些任务都是提交到该静态线程池中执行,执行的时候通过调用doInBackground()方法执行异步任务,期间会通过Handler将相关的信息发送到UI线程中,但神奇的是,并不是调用UI线程中的回调方法,而是AsyncTask本身就有一个Handler的子类InternalHandler会响应这些消息并调用AsyncTask中相应的回调方法。从上面的代码中我们也可以看到,UI的ProgressBar的更新是在AsyncTask的onProgressUpdate(),而ImageView是在onPostExecute()方法里。这是因为InternalHandler其实是在UI线程里面创建的,所以它能够调用相应的回调方法来更新UI。
&&&& &AsyncTask就是专门用来处理后台任务的,而且它针对后台任务的五种状态提供了五个相应的回调接口,使得我们处理后台任务变得非常方便。
&&&&& 如果只是普通的UI更新操作,像是不断更新TextView这种动态的操作,可以使用Handler,但如果是涉及到后台操作,像是下载任务,然后根据后台任务的进展来更新UI,就得使用AsyncTask,但如果前者我们就使用AsyncTask,那真的是太大材小用了!!
3.利用Runnable更新UI界面
&&&&& 剩下的方法都是围绕着Runnable对象来更新UI。
&&&&& 一些组件本身就有提供方法来更新自己,像是ProgressBar本身就有一个post()方法,只要我们传进一个Runnable对象,就能更新它的进度。只要是继承自View的组件,都可以利用post()方法,而且我们还可以使用postDelay()方法来延迟执行该Runnable对象。android的这种做法就真的是让人称道了,至少我不用为了一个ProgressBar的进度更新就写出一大堆难懂的代码出来。
&&&&& 还有另一种利用Runnable的方式:Activity.runOnUiThread()方法。这名字实在是太直白了!!使用该方法需要新启一个线程:
1 class ProgressThread extends Thread {
public void run() {
super.run();
while (mProgress &= 100) {
runOnUiThread(new Runnable() {
public void run() {
mProgressBar.setProgress(mProgress);
mProgress++;
Thread.sleep(100);
} catch (InterruptedException e) {
1.如果只是单纯的想要更新UI而不涉及到多线程的话,使用View.post()就可以了;
2.需要另开线程处理数据以免阻塞UI线程,像是IO操作或者是循环,可以使用Activity.runOnUiThread();
3.如果需要传递状态值等信息,像是蓝牙编程中的socket连接,就需要利用状态值来提示连接状态以及做相应的处理,就需要使用Handler + Thread的方式;
4.如果是后台任务,像是下载任务等,就需要使用AsyncTask。
阅读(...) 评论()Android定时刷新界面的两种方法(计时器与进程)
方式一、使用Timer(定时器)和TimerTask实现示例代码:public class MainActivity extends Activity {&&& private TextV&&& final Handler handler = new Handler() {&&&&&&& public void handleMessage(Message msg) {&&&&&&&&&&& switch (msg.what) {&&&&&&&&&&& case 1&&&&&&&&&&&&&&& update();&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&& super.handleMessage(msg);&&&&&&& }&&&&&&& void update() {&&&&&&&&&&& 刷新msg的内容&&&&&&& }&&& };&&& Timer timer = new Timer();&&& TimerTask task = new TimerTask() {&&&&&&& public void run() {&&&&&&&&&&& Message message = new Message();&&&&&&&&&&& message.what = 1;&&&&&&&&&&& handler.sendMessage(message);&&&&&&& }&&& };&&&& Called when the activity is first created.&&& @Override&&& public void onCreate(Bundle savedInstanceState) {&&&&&&& super.onCreate(savedInstanceState);&&&&&&& setContentView(R.layout.main);&&&&&&& msg = (TextView) findViewById(R.id.txtMsg);&&&&&&& msg.setText(你好啊!);&&&&&&& timer.schedule(task, 00& 30); 启动timer&&& }&&& @Override&&& protected void onDestroy() {&&&&&&& if (timer != null) { 停止timer&&&&&&&&&&& timer.cancel();&&&&&&&&&&& timer =&&&&&&& }&&&&&&& super.onDestroy();&&& }}方式二、使用Runnable和Handle示例代码public class MainActivity extends Activity {&&& private TextV&&& private Handler handler = new Handler();&&& private Runnable runnable = new Runnable() {&&&&&&& public void run() {&&&&&&&&&&& this.update();&&&&&&&&&&& handler.postDelayed(this, ); 间隔120秒&&&&&&& }&&&&&&& void update() {&&&&&&&&&&& 刷新msg的内容&&&&&&& }&&& };&&&& Called when the activity is first created.&&& @Override&&& public void onCreate(Bundle savedInstanceState) {&&&&&&& super.onCreate(savedInstanceState);&&&
分享这篇日志的人也喜欢
月末加油!
一日不见兮思如狂
想要遇见你?
任务好难哦
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@vip.sina.com··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场没有更多推荐了,
不良信息举报
举报内容:
Android 刷新UI界面,线程间通讯方法总结,Android 自学之路
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 android 刷新界面 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信