- 浏览: 152285 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
xjk112:
2015-05-08 13:21
我奋斗了18年才和你坐在一起喝咖啡[转] -
sandy_vv:
给达内广告,收费 ?
Java 利用url下载MP3保存到本地 -
78945612:
哥们
这个对于初学者怎么整呢?
android 定时关机 -
cn23snyga:
请教贵博,用ACE 绘制出的图表,可以捕捉到点击事件的坐标值 ...
使用achartengine开发曲线图相关的Android应用程序(zhuan) -
qi19901212:
楼主你好,我开发的achartengine放在 scrollv ...
Android开发工具之AChartEngine
本文转自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的刷新问题,大家都在讨论 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开发之Tools
2011-10-02 00:19 943AChartEngine is a charting libr ... -
使用achartengine开发曲线图相关的Android应用程序(zhuan)
2011-10-02 00:10 3008应用程序的开发过程中,经常会遇到和曲线图打交道的情况,相比自己 ... -
或许您还不知道的八款开源Android游戏引擎
2011-09-29 12:38 805很多初学Android游戏开发 ... -
Android开发工具之AChartEngine
2011-09-29 12:11 3119最近在做一个关于股票的软件(for Android),在软件中 ... -
android 事件处理(转)
2011-09-15 12:14 1120android中的事件类型分为按键事件和屏幕触摸事件,Touc ... -
android paint设置字体 中文字体 楷体 和自动换行方法(zhuan)
2011-09-14 16:19 3874Bitmap bmp = BitmapFactory.deco ... -
Android Canvas类介绍(zhuan)
2011-09-14 14:57 979当我们调整好画笔之后,现在需要绘制到画布上,这就得用Can ... -
Android Canvas类介绍(zhuan)
2011-09-14 14:56 0当我们调整好画笔之后,现在需要绘制到画布上,这就得用Can ... -
Android OpenGL之生成FloatBuffer
2011-09-06 08:56 1521public FloatBuffer getFloatBuff ... -
Activity之间的跳转(A-B-A)
2011-09-05 12:29 1054Activity A 中: Intent intent ... -
Android OpenGL相关
2011-09-02 15:46 7430x10000是出于OPENGL前期内存节约的考虑, 以INT ... -
Android 返回键
2011-09-01 17:11 1094@Override public boolean onK ... -
android selector(zhuan)
2011-08-30 10:06 582<?xml version="1.0" ... -
android 定时关机
2011-08-29 10:19 1311Calendar calendar = Calendar.ge ... -
android 相关2
2011-08-25 12:31 802AndroidManifest.xml的activity里加a ... -
Android 中的ListView内容刷新问题(转)
2011-08-03 21:22 1223本文转自http://www.linuxidc.com/Lin ... -
android listview
2011-08-03 21:21 869Android 中的ListView内容刷新 对于ListV ... -
android相关
2011-07-21 12:48 825android:screenOrientation=" ... -
Android中JNI程序的编写(zhuan)
2011-07-15 18:48 988zhuan(http://luco1130.blog.163. ... -
Android_Handler,Looper,Message深入分析
2011-04-07 18:49 1522在网上有许多资料对这三者关系的分析,但都比较笼统不够细 ...
相关推荐
在Activity中,我们可以通过Adapter(如CursorAdapter)将SQLite查询结果绑定到ListView,这样每次数据库更新时,ListView都会自动刷新。同时,为“删除”按钮设置OnClickListener,当用户点击时,获取被选中的联系...
本文将深入探讨如何利用Service和BroadcastReceiver配合ListView来解决这类问题,以及如何避免在显示多个倒计时时出现卡顿、闪动和错乱。 首先,毫秒级倒计时的核心在于准确地计算时间。在Java或Android中,我们...
7. **Android App移动开发**:开发Android应用需要掌握Java或Kotlin语言,理解Android SDK、Android Studio开发环境,以及Android的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)等基础知识。...
开发者需要熟悉Android的四大组件(Activity、Service、BroadcastReceiver和ContentProvider)以及Java的基本语法。 2. **用户界面设计**:应用的UI设计是通过XML布局文件实现的,包括ListView用于显示股票列表,...
18. 自定义控件:Android 中可以实现自定义控件,如下拉刷新 ListView、自定义 SlidingMenu 以及可轮播 ViewPager 的实现原理。熟悉自定义控件可以帮助开发者更好地设计应用程序的界面。 Android 软件工程师需要...
3.Handler 消息队列 刷新 UI 4.访问系统提供的内容提供者,获取歌曲信息。 5.ListView控件使用和自定义Adapter 5.Activity 和Service通信(通过广播) 6.broadcastreceiver和Handler一起使用来跟新UI(广播接收者...
Android应用通常由多个组件构成,如Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)和ContentProvider(内容提供者)。在微博客户端中,Activity用于展示用户界面,比如登录页面、主界面、...
理解Android的组件模型(Activity、Service、BroadcastReceiver、ContentProvider)和生命周期管理是开发新闻阅读器的基础。 二、Java编程 Java作为Android应用的主要开发语言,其面向对象的特性使得代码结构清晰,...
Android应用通常由多个组件构成,如Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容提供者)。在口袋微博的客户端代码中,可能包含了这些组件的实现,用于处理用户...
2. **Intent机制**:Intent是Android系统中用于启动其他组件(如Activity、Service)的信使。源码中可能包含不同类型的Intent使用,如显式Intent和隐式Intent,以及如何传递数据。 3. **布局管理器(Layout ...
2. **AndroidManifest.xml**:这是Android应用的核心配置文件,包含了应用的元数据,如权限、活动(Activity)、服务(Service)等的声明。在RSS阅读器中,可能需要声明网络访问权限,因为应用需要连接到RSS源来获取...
Android应用通常由Activity、Service、BroadcastReceiver、ContentProvider四大组件构成。在这个项目中,Activity作为用户界面的主要载体,负责展示通讯录列表和交互操作。Service可能用于后台数据同步或者通信任务...
14. **Handler机制原理**:Android中的消息处理机制,涉及Message、Looper、Handler三者之间的协作,用于线程间通信。 15. **HTTPS流程**:安全的HTTP协议,涉及SSL/TLS握手过程,保证数据传输的安全性。 16. **...
9. **多线程和异步处理**:Android应用中的网络请求、耗时操作通常在后台线程执行,以避免阻塞主线程,这可能涉及AsyncTask、Handler、Service等机制。 10. **版本控制和开源许可证**:作为开源项目,源码中应该...
Android面试题汇总涵盖了Android开发中的关键知识点,包括Activity、Service、Intent、BroadcastReceiver、ContentProvider、布局、数据存储、UI设计、多线程、内存管理、框架工作原理等多个方面。以下是对这些知识...
7. **Android线程与Handler**: 处理异步任务时,通常使用Handler、Looper和Message配合,实现主线程与工作线程之间的通信。主线程中的Handler接收并处理来自工作线程的Message,确保UI更新在主线程进行。 8. **...
DeskClock的用户界面设计遵循Material Design指南,源码中包含了各种View和Adapter的使用,如GridView、ListView等,展示了如何构建可定制化的布局和高效的数据显示。同时,事件监听和触摸反馈的处理也体现了...
2. 滑动刷新:SwipeRefreshLayout控件,提供下拉刷新功能。 3. 加载动画:提高用户体验的加载等待动画。 九、性能优化 1. 布局优化:减少嵌套布局,使用ConstraintLayout等高效布局。 2. 图片加载库:如 Glide 或 ...
4. **RecyclerView**:用于显示列表或网格数据,替代了旧版的ListView,具有更好的性能和灵活性,支持滚动优化、多类型视图、动画效果等。 5. **Adapter**:连接数据源和视图,将数据转化为适配器可以理解的格式,...