`
xfjt297857539
  • 浏览: 152285 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Android ListView刷新 (Handler/Service)

 
阅读更多
本文转自http://blog.sina.com.cn/s/blog_493c76100100t6f2.html

近期在网上看了下Android的刷新问题,大家都在讨论 invalidate 和 postInvalidate 。想必大家都试用过了,  invalidate是针对UI线程,postInvalidate是针对非UI线程。 
不知同行们有没有过这种想法,用后台的Service调取Activity的Handler进行局部view的刷新?新手们可能会想到在Service里直接调取当前活动的Activity的静态方法不就行了,可是这样会违反了单线程的不安全问题,导致应用直接关闭。而Handler是运行在Activity UI主线程中,如同一个线程。它可以与子线程互相通信,对主线程的UI进行数据的操作。
Handler可以对 Message对象和Runnable对象 进行操作。您可以灵活使用Handler中的一些方法,如:post(Runnable) 和sendMessage(Message)等。
这里给大家一个些代码,请参考。代码很菜,请指教谢谢。

public class RefreshMain extends Activity {

private ListView changeList = null;
private ListAdapter adapter = null;
private RefreshService refreshService = null;

public Handler messageHandler;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

changeList = (ListView) findViewById(R.id.refresh_list);
adapter = new ListAdapter(this);
changeList.setAdapter(adapter);

}

@Override
public void onStart() {
super.onStart();
Looper looper = Looper.myLooper();
messageHandler = new MessageHandler(looper, changeList, this);
}

@Override
public void onResume() {
super.onResume();
bindService();
}

@Override
public void onDestroy() {
unBindService();
super.onDestroy();
}

private boolean _service_bind = false;
private ServiceConnection serviceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("refreshService", "_service is Bind.");
refreshService = ((RefreshService.ServiceBinder) service)
.getService();
refreshService.setActivity(RefreshMain.this);
}

public void onServiceDisconnected(ComponentName name) {
refreshService = null;
}
};

private void bindService() {
Intent intentService = new Intent(RefreshMain.this,
RefreshService.class);
RefreshMain.this.startService(intentService);
RefreshMain.this.bindService(intentService, serviceConnection,
Context.BIND_AUTO_CREATE);
_service_bind = true;
}

private void unBindService() {
if (refreshService != null) {
refreshService.stopService();
}
if (_service_bind) {
RefreshMain.this.unbindService(serviceConnection);
_service_bind = false;
}
Intent intentService = new Intent(RefreshMain.this,
RefreshService.class);
this.stopService(intentService);
}
}

public class ListAdapter extends BaseAdapter {

private LayoutInflater listInflater;

List<Map<String, Object>> listData = null;

public final class DataView {

public TextView viewTitle;
public TextView viewTime;
public TextView viewContent;
}

public ListAdapter(Context context) {

this.listInflater = LayoutInflater.from(context);
listData = getData();
}

public int getCount() {
return listData.size();
}

public Object getItem(int position) {
return listData.get(position);
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
DataView item = null;
if (convertView == null) {
item = new DataView();
convertView = listInflater.inflate(R.layout.refresh_list, null);
item.viewTitle = (TextView) convertView.findViewById(R.id.refresh_title);
item.viewTime = (TextView) convertView.findViewById(R.id.refresh_time);
item.viewContent = (TextView) convertView.findViewById(R.id.refresh_content);
convertView.setTag(item);
} else {
item = (DataView) convertView.getTag();
}

item.viewTitle.setText((String) listData.get(position).get("title"));
item.viewTime.setText((String) listData.get(position).get("time"));
item.viewContent.setText((String) listData.get(position).get("content"));

return convertView;
}

private List<Map<String, Object>> getData() {

List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
Map<String, Object> map = null;
for (int i = 1; i <= 5; i++) {
map = new HashMap<String, Object>();
map.put("title", "title " + i);
map.put("time", String.valueOf(System.currentTimeMillis()));
map.put("content", "content " + i + " / " + String.valueOf(System.currentTimeMillis()));
data.add(map);
}
return data;
}

}

public class MessageHandler extends Handler {

private ListView listView;
private RefreshMain activity;

public MessageHandler(Looper looper, ListView _listView,
RefreshMain _activity) {
super(looper);
listView = _listView;
activity = _activity;
}

@Override
public void handleMessage(Message msg) {
//这里大家集思广益,我在这儿偷懒了,嘿嘿
ListAdapter adapter = new ListAdapter(activity);
listView.setAdapter(adapter);

}
}

public class RefreshService extends Service {
private boolean started;

private boolean threadDisable = false;

private Activity _activity = null;

private ServiceBinder serviceBinder = new ServiceBinder();

public class ServiceBinder extends Binder {

RefreshService getService() {
return RefreshService.this;
}
}

public boolean isStarted() {
return started;
}

public void stopService() {
started = false;
}

public void setActivity(Activity activity) {
_activity = activity;
}

@Override
public void onStart(Intent intent, int startId) {
started = true;
Log.i("RefreshService", "service started.");
}

@Override
public IBinder onBind(Intent intent) {
Log.i("RefreshService", "service onBind.");
return serviceBinder;
}

@Override
public boolean onUnbind(Intent i) {
started = false;
return started;
}

@Override
public void onCreate() {
super.onCreate();

Thread thread = new Thread() {
@Override
public void run() {
while (!threadDisable) {
try {
Thread.sleep(10000);
if (started) {
//这里不用我说吧。取前当前活动Activity哈。
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;

if("com.sh.RefreshMain".equals(cn.getClassName())){
((RefreshMain)_activity).messageHandler.sendMessage(Message.obtain());;
}
}
} catch (InterruptedException e) {
}
}
}
};

thread.start();

Log.i("RefreshService", "service created.");
}

@Override
public void onDestroy() {
super.onDestroy();
threadDisable = true;
Log.i("RefreshService", "service shutdown.");
}

}
xml 就不用发了吧,大家可以配一下喽。
分享到:
评论

相关推荐

    基于Android实现电话本管理系统

    在Activity中,我们可以通过Adapter(如CursorAdapter)将SQLite查询结果绑定到ListView,这样每次数据库更新时,ListView都会自动刷新。同时,为“删除”按钮设置OnClickListener,当用户点击时,获取被选中的联系...

    毫秒级倒计时+listview

    本文将深入探讨如何利用Service和BroadcastReceiver配合ListView来解决这类问题,以及如何避免在显示多个倒计时时出现卡顿、闪动和错乱。 首先,毫秒级倒计时的核心在于准确地计算时间。在Java或Android中,我们...

    Android应用源码动态ListView,支持异步更新列表,异步更新图片-IT计算机-毕业设计.zip

    7. **Android App移动开发**:开发Android应用需要掌握Java或Kotlin语言,理解Android SDK、Android Studio开发环境,以及Android的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)等基础知识。...

    股票查询软件android源码

    开发者需要熟悉Android的四大组件(Activity、Service、BroadcastReceiver和ContentProvider)以及Java的基本语法。 2. **用户界面设计**:应用的UI设计是通过XML布局文件实现的,包括ListView用于显示股票列表,...

    Android开发_2年工作经验Android软件工程师求职简历个人简历.pdf

    18. 自定义控件:Android 中可以实现自定义控件,如下拉刷新 ListView、自定义 SlidingMenu 以及可轮播 ViewPager 的实现原理。熟悉自定义控件可以帮助开发者更好地设计应用程序的界面。 Android 软件工程师需要...

    Android 播放器

    3.Handler 消息队列 刷新 UI 4.访问系统提供的内容提供者,获取歌曲信息。 5.ListView控件使用和自定义Adapter 5.Activity 和Service通信(通过广播) 6.broadcastreceiver和Handler一起使用来跟新UI(广播接收者...

    android开发新浪微博客户端源代码

    Android应用通常由多个组件构成,如Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)和ContentProvider(内容提供者)。在微博客户端中,Activity用于展示用户界面,比如登录页面、主界面、...

    Android新闻阅读器

    理解Android的组件模型(Activity、Service、BroadcastReceiver、ContentProvider)和生命周期管理是开发新闻阅读器的基础。 二、Java编程 Java作为Android应用的主要开发语言,其面向对象的特性使得代码结构清晰,...

    Android源码——口袋微博服务器客户端代码.zip

    Android应用通常由多个组件构成,如Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容提供者)。在口袋微博的客户端代码中,可能包含了这些组件的实现,用于处理用户...

    android 例子汇总源码

    2. **Intent机制**:Intent是Android系统中用于启动其他组件(如Activity、Service)的信使。源码中可能包含不同类型的Intent使用,如显式Intent和隐式Intent,以及如何传递数据。 3. **布局管理器(Layout ...

    RSS阅读器(Android)

    2. **AndroidManifest.xml**:这是Android应用的核心配置文件,包含了应用的元数据,如权限、活动(Activity)、服务(Service)等的声明。在RSS阅读器中,可能需要声明网络访问权限,因为应用需要连接到RSS源来获取...

    Android应用源码之仿QQ列表通讯录项目-IT计算机-毕业设计.zip

    Android应用通常由Activity、Service、BroadcastReceiver、ContentProvider四大组件构成。在这个项目中,Activity作为用户界面的主要载体,负责展示通讯录列表和交互操作。Service可能用于后台数据同步或者通信任务...

    Android面试题总结-史上最全.pdf

    14. **Handler机制原理**:Android中的消息处理机制,涉及Message、Looper、Handler三者之间的协作,用于线程间通信。 15. **HTTPS流程**:安全的HTTP协议,涉及SSL/TLS握手过程,保证数据传输的安全性。 16. **...

    安卓Android源码——高仿微信.zip

    9. **多线程和异步处理**:Android应用中的网络请求、耗时操作通常在后台线程执行,以避免阻塞主线程,这可能涉及AsyncTask、Handler、Service等机制。 10. **版本控制和开源许可证**:作为开源项目,源码中应该...

    Android面试题汇总.doc

    Android面试题汇总涵盖了Android开发中的关键知识点,包括Activity、Service、Intent、BroadcastReceiver、ContentProvider、布局、数据存储、UI设计、多线程、内存管理、框架工作原理等多个方面。以下是对这些知识...

    android面试大总结

    7. **Android线程与Handler**: 处理异步任务时,通常使用Handler、Looper和Message配合,实现主线程与工作线程之间的通信。主线程中的Handler接收并处理来自工作线程的Message,确保UI更新在主线程进行。 8. **...

    Android5.0 DeskClock时钟源码

    DeskClock的用户界面设计遵循Material Design指南,源码中包含了各种View和Adapter的使用,如GridView、ListView等,展示了如何构建可定制化的布局和高效的数据显示。同时,事件监听和触摸反馈的处理也体现了...

    新闻客户端

    2. 滑动刷新:SwipeRefreshLayout控件,提供下拉刷新功能。 3. 加载动画:提高用户体验的加载等待动画。 九、性能优化 1. 布局优化:减少嵌套布局,使用ConstraintLayout等高效布局。 2. 图片加载库:如 Glide 或 ...

    Android高仿网易新闻客户端

    4. **RecyclerView**:用于显示列表或网格数据,替代了旧版的ListView,具有更好的性能和灵活性,支持滚动优化、多类型视图、动画效果等。 5. **Adapter**:连接数据源和视图,将数据转化为适配器可以理解的格式,...

Global site tag (gtag.js) - Google Analytics