异步加载

  1. AsyncTask
    AsyncTask简介 AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦。阅读 AsyncTask的源码可知,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常 成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。 AsyncTask是抽象类,其结构图如下图所示:
    Params 启动任务执行的输入参数,比如HTTP请求的URL。
    Result 后台执行任务最终返回的结果,比如String。
    子类必须实现抽象方法doInBackground(Params… p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。
    通常还应 该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创 建实例。
    AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的 就是实现这些方法。在任务的执行过程中,这些方法被自动调用,运行过程,如下图所示:
    onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
    在执行过程中可以调用 publicProgress(Progress…)来更新任务的进度。
    onProgressUpdate(Progress…) 此方法在主线程执行,用于显示任务执行的进度。
    onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回
//主线程中调用异步
new MyAsyncTask(textview).execute(params);
//取消异步操作//需要与activity生命周期一致则写入onPause()
if (asyncTask != null && asyncTask.getStatus() == AsyncTask.Status.RUNNING) {
    asyncTask.cancel(true);//cancel只是标记状态,并不是真正取消要在异步中判断状态
}
//异步类
class MyAsyncTask extends AsyncTask<String, Void, String> {//params progress result
    TextView tv;

    public MyAsyncTask(TextView textview) {
        tv = textview;
    }
    @Override
    protected String doInBackground(String... params) {
        if (isCancelled()) {//判断线程状态,可中断耗时操作
        }
        return params[0];
    }

    @Override
    protected void onPostExecute(String s) {
        if (isCancelled()) {//判断线程状态,可中断耗时操作
        }
        if (tv != null) {
            tv.setText(s);
        }
    }
}

2.采用Thread + Handler + Message
handler简介 Handler为Android提供了一种异步消息处理机制,它包含两个队列,一个是线程列队,另一个是消息列队。使用post方法将线 程对象添加到线程队列中,使用
继而回调Handler中public void handleMessage(Message msg)方法。因此 在创建Handler时应该使用匿名内部类重写该方法。
如果想要这个流程一直执行的话,可以再run方法内部执行postDelay或者 post方法,再将该线程对象添加到消息队列中重复执行。
想要停止线程,调用Handler对象的removeCallbacks(Runnable r)从 线程队列中移除线程对象,使线程停止执行。
3.采用Thread + Handler + post方法
使用post方法将Runnable对象放到Handler的线程队列中,该Runnable的执行其实并未单独开启线程,而是仍然在当前Activity的UI线程中执行,Handler只是调用了Runnable对象的run方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cesium是一个用于创建地球和其他天体的3D地理信息系统(GIS)可视化的开源JavaScript库。在Cesium中,异步加载是一种常见的技术,用于在加载大型数据集或复杂场景时提高性能和用户体验。 异步加载是指在加载资源时,不会阻塞主线程,而是通过并行加载和渲染来提高效率。在Cesium中,异步加载主要应用于以下几个方面: 1. 模型加载:Cesium支持加载各种3D模型格式,如glTF、COLLADA等。当加载大型模型时,可以使用异步加载来避免页面卡顿或加载时间过长的问题。 2. 影像加载:Cesium可以加载各种影像数据,如卫星影像、地形数据等。由于影像数据通常较大,使用异步加载可以提高加载速度和用户体验。 3. 矢量数据加载:Cesium支持加载各种矢量数据格式,如GeoJSON、KML等。当加载大量矢量数据时,可以使用异步加载来提高性能和交互响应速度。 在Cesium中,异步加载通常通过使用Promise对象来实现。Promise是一种用于处理异步操作的对象,它可以表示一个异步操作的最终完成或失败,并返回相应的结果。 下面是一个示例代码,演示了如何使用异步加载加载一个3D模型: ```javascript // 创建一个Promise对象 var promise = Cesium.Model.fromGltf({ url: 'path/to/model.gltf', basePath: 'path/to/assets' }); // 当模型加载完成后,执行回调函数 promise.then(function(model) { // 将模型添加到场景中 viewer.scene.primitives.add(model); }).otherwise(function(error) { // 加载失败时的处理逻辑 console.log('An error occurred: ' + error); }); ``` 在上面的代码中,`Cesium.Model.fromGltf`方法返回一个Promise对象,表示模型的异步加载过程。通过调用`then`方法和`otherwise`方法,可以分别指定加载成功和失败时的回调函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值