以前在让使用View时,如果要更新界面,总是使用到线程来更新界面,但在看了SDK之后,发现APIDemo里没有使用过多线程的,使用的是另一个方法。
以前写过一个简单的小游戏,用了View,页面更新的代码如下
public void run() {
while( drawing )
{
try {
//更新球的位置信息
update();
//通知系统更新界面,相当于调用了onDraw函数
postInvalidate();
//界面更新的频率,这里是每30ms更新一次界面
Thread.sleep(30);
//Log.e(TAG, "drawing");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这样做看起来很简洁,做在写程序的过程给我造成过一些麻烦,就是线程的生存周期要完全自己来负责,一个不小心的话,当这个Activity的生命周期本应该结束时,这个线程却还一直在后台运行着,相当浪费资源,Android的虚拟机不会主动杀死正在运行中的线程的。如果线程还存在着,却又想新开这个线程,又来抛出错误……还有数据同步的问题等等,这些过程细节都要考虑得周到,不然很容易导致程序被强制关闭。
然而在APIDemo中,在需要不停地重绘界面时,它是在onDraw函数的最后使用了invalidate();
APIDemo的代码请参考Graphics包内的Arcs。
主要的思路如下:
public void onDraw(Canvas canvas)
{
dosomething();
invalidate();
Log.v("main", "invaliate");
}
其它部分与以前的无异。这样做的好处是将绘图的线程管理工作全部交给Android来负责(Android本身会有一个线程来专门负责这绘图的),不需要再操心上面所述的问题。如果重绘过程需要有延迟的话,可以使用postInvalidateDelayed (long delayMilliseconds),相当于Thread.sleep(milliseconds)。相当好用,写View的过程少了一些不必要的烦躁。但仍有可能还会有数据的同步问题。但我想可不可以通过Handler,将所以数据的处理全部交给UI线程呢,这样不就将同步问题转得简单点了吗?得我将Handler学得深一点后再实验一下。
这个过程有点类似于尾递归,但又跟递归有实质的区别,invalidate()函数是只是负责发送请求的(在非线程外应使用postInvalidate()),执行函数时,往绘图线程的请求队列增加一个请求,当线程处理这个请求时,就会将界面重绘,这是一个异步的过程,invalidate()并没有执行onDraw,所以并不是递归,没有递归所需的栈,更不用担心爆栈什么的。我上面的代码后面添加了一个log语句,在Logcat里面可以看到有这个main的语句在不停地刷新的。
这里面也涉及到了Android的绘图机制的问题,也就是Handler机制,我现在也只是有一个很模糊的概念,等我学多点后再写出来理清下思路。总的来说,就是Android的绘图是专门由一个线程来负责的,这个线程里有一个请求队列,这个线程会不断地从队列里取出请求来绘制界面,在UI线程外企图修改界面是无效的。
看起来很简单的一句话,涉及的东西不少啊。学无止境。。。。。o(∩∩)o...哈哈
分享到:
相关推荐
另一种机制是基于Handler/Looper的,适用于需要持续更新UI的情况,比如动画或者消息推送。Handler在主线程中创建,用于接收由其关联的Looper分发的消息。Looper在后台线程运行,不断检查MessageQueue是否有待处理的...
Android事件处理的另一种方式是基于监听接口,常见于View组件。例如,通过实现OnClickListener、OnTouchListener等接口,开发者可以直接在代码中定义事件触发后的行为。这种方式更加灵活,但可能会导致代码过于分散...
另一种方法是在应用启动时检查版本信息,如果发现新版本,引导用户完成首次启动流程。 以上就是`android客户端自动检测更新`的实现流程,涉及到的各个技术点包括FTP下载、XML解析、文件操作以及Android系统的权限...
Loader是Android的另一种异步数据加载框架,它提供了更好的生命周期管理和数据变更通知。可以使用CursorLoader结合ContentProvider来加载本地存储的图片,也可以自定义Loader来处理网络请求。 四、缓存策略 为了...
- **LoaderManager/Loader**: 这是Android提供的另一种异步数据加载机制,它可以监控数据源变化并自动更新视图,适合于数据量较大且需要实时更新的场景。 2. **ListView的优化** - **ViewHolder模式**: 为减少...
这里定义了一个`ViewStub`,它将在运行时被替换为另一个布局。 #### 展开视图 ```java findViewById(R.id.stub_import).setVisibility(View.VISIBLE); ``` 或获取视图: ```java View importPanel = ((ViewStub)...
- 另一种处理异步操作的方式是使用Handler和Runnable。创建一个Handler对象,然后在线程中创建Runnable实例并post到Handler,Handler会在线程的消息队列中处理Runnable,这样可以在主线程中更新UI。 6. **数据加载...
4. Handler/Looper机制:另一种方式是利用Handler和Looper创建一个后台线程,负责图片的下载和缓存,然后通过Handler将图片发送回主线程更新到ImageView。这种方法需要更多的代码和对线程同步的理解。 在实际项目中...
另一种常见的策略是使用`Handler`对象。通过在UI线程创建一个`Handler`,并使用`sendMessage()`或`post()`方法,可以将消息或任务发送回UI线程,从而更新UI。这为多线程编程提供了更高级的控制和灵活性。 #### 异步...
`AsyncTask`是Android提供的另一种执行后台任务的方式,它简化了多线程编程的过程。使用`AsyncTask`的关键在于: - **doInBackground**: 在后台线程中执行耗时操作。 - **onProgressUpdate**: 在主线程中更新进度。 ...
另一种方式是监听数据源的变化,如`LiveData`或`Observable`,它们会在数据改变时自动触发观察者更新UI。 5. **异步处理**: 为了不影响用户体验,数据加载和更新通常在后台线程进行。可以使用`AsyncTask`、`...
另一种方法是通过定时任务定期查询数据并更新界面,如使用`Handler`的`postDelayed()`或`TimerTask`。 4. **异步加载和更新**: 为了避免阻塞主线程,数据加载和刷新操作通常应在后台线程执行,如`AsyncTask`或`...
SurfaceView是Android提供的一种特殊类型的View,它可以提供一个独立于应用程序主线程的绘制表面,直接与硬件GPU交互,适合进行高性能的图形渲染,如游戏或视频播放。SurfaceView有自己的Surface对象,它存在于窗口...
* Handler 是 Android 中的一种机制,用于在多线程之间传递消息。 * Handler 可以将消息从一个线程发送到另一个线程。 4. Activity、Intent、Service 的关系: * Activity 是用户界面组件,用于与用户交互。 * ...
**Handler** 和 **Message** 机制是另一种异步处理方式,适用于更复杂的异步通信场景。Handler通常在UI线程中创建,用于接收和处理由其他线程发送的消息。Message对象用于承载数据,而Handler的`sendMessage()`和`...
`Gallery`是Android SDK提供的一种水平滚动的视图,类似于iOS中的Carousel控件。它可以展示一系列的元素,如图片,让用户通过左右滑动来选择。`Gallery`的主要特点包括: 1. **循环滚动**:`Gallery`支持无限循环...
8. **Handler与MessageQueue**:这是另一种处理异步事件的方式,通过创建Handler实例,配合Message和MessageQueue,可以在不同的线程间发送和处理消息。 9. **EventBus**:第三方库,提供发布/订阅模式的事件总线。...
2. **LoaderManager/Loader**:Android提供的另一种异步数据加载框架,它具有生命周期管理能力,适合用于Activity或Fragment中。使用Loader可以更方便地管理和控制数据加载的过程。 3. **Universal Image Loader ...
6. **IntentService**:另一种执行后台任务的方式是使用`IntentService`,它可以自动处理线程并发和停止服务,适合于处理耗时操作如文件下载。 7. **DownloadManager**:Android系统提供了一个`DownloadManager`类...
run()方法是线程体内容,需要在另一个线程的上下文中调用,而start()方法会创建线程并调用run()。 7. Final、finally、finalize()的区别:final用于声明常量或修饰类、方法和变量,禁止被继承、重写或重新赋值;...