Android核心基础-6.Android 耗时操作

1.什么是ANR

  • 在应用程序的主线程中执行一段耗时的代码, 就有可能出现ANR异常.
  • 耗时的代码未执行结束时, 界面会卡住, 用户对界面进行了操作, 10秒之后耗时代码如果还未结束, 就会出现ANR异常

我们的布局文件中有个TextView和一个按钮Button

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="30sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="go"
        android:text="GO" />

当点击Button按钮时触发go()函数,我们看到函数中执行了一个耗时操作,此时将出现界面卡死现象。

public void go(View v) {
    for (int i = 1; ; i++) {
        System.out.println(i);
        SystemClock.sleep(1000);
    }
}

2.怎么避免ANR

  • 主线程中不要执行耗时的代码
  • 如果一定要做耗时的事情, 开启新线程, 在新线程中执行

我们将耗时操作放置在一个线程中,那么界面就不会被卡死。

public void go(View v) {
    new Thread() {
        public void run() {
            for (int i = 1; ; i++) {
                System.out.println(i);
                SystemClock.sleep(1000);
            }
        }
    }.start();
}

3.UI Thread

  • 安卓手机中主线程负责刷新界面, 以及处理用户的操作
  • 应用程序的界面都是由主线程创建的
  • 界面的修改也只能在主线程中执行

4.Handler

有的时候我们需要执行一些耗时的代码, 会开启新线程, 这时又需要更新界面, 必须在主线程中操作, 那么就需要使用Handler来进行线程之间的通信

Handler工作流程图

4.1 sendMessage():

  • 新线程向主线程发送一个包含数据的消息, 主线程获取消息中的数据
  • 在主线程中创建Handler子类对象, 重写handleMessage()方法
  • 新线程中可以使用Handler的引用调用sendMessage()方法, 发送一个Message对象
  • 只要执行了sendMessage()方法, 那么主线程会自动执行handleMessage()方法, 收到Message对象

4.2 post():

  • 新线程向主线程发送一段代码, 主线程直接执行
  • 在主线程中创建Handler对象
  • 新线程中可以使用Handler调用post()方法发送一个Runnable对象
  • 主线程会自动执行Runable的run()

通过Handler发送Message通知主线程更新界面

public class SendMessageActivity extends Activity {

    private TextView tv;
    private Handler handler = new Handler(){
        public void handleMessage(Message msg) {    // 该方法在sendMessage()方法之后执行, 形参就是发送过来的Message对象
            tv.setText(msg.obj + "");               // 主线程更新界面
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);  
    }

    public void go(View v) {
        new Thread() {
            public void run() {
                for (int i = 1; ; i++) {
                    // Message msg = new Message();         // 创建消息对象
                    Message msg = handler.obtainMessage();  // 从消息池中获取一个Message(比直接new效率要高)
                    msg.obj = i;                            // 把数据放在消息对象中
                    handler.sendMessage(msg);               // 在新线程中发送消息对象, 主线程会自动执行handleMessage()方法
                    System.out.println(i);
                    SystemClock.sleep(1000);
                }
            }
        }.start();
    }
}

课外知识:Message.obtain()和Handler.obtain()原理都一样,都是去消息池获取一个新的message对象。
但是Message的池全局性更高,两个线程同时使用到同一个的概率高;而Handler的范围相对要小点,指定了某一个Handler的Message对象。

直接通过post发送一段可执行代码更新界面

public class PostActivity extends Activity {

    private TextView tv;
    private Handler handler = new Handler();
    private int i;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);  
    }

    public void go(View v) {
        System.out.println("go: " + Thread.currentThread().getName());
        new Thread() {
            public void run() {
                System.out.println("run: " + Thread.currentThread().getName());
                for (i = 1; ; i += 2) {
                    handler.post(new Runnable(){    // 在新线程中使用Handler向主线程发送一段代码, 主线程自动执行run()方法
                        public void run() {
                            System.out.println("Runnable: " + Thread.currentThread().getName());
                            tv.setText(i + "");
                        }
                    });

                    System.out.println(i);
                    SystemClock.sleep(1000);
                }
            }
        }.start();
    }
}

通过打印出来的log:
我们看到go: main, run: Thread-143, Runnable: main
表明post中的代码在主线程中执行的。

示例源代码->百度网盘

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Framework面试题是关于Android操作系统框架的一些问题,主要涉及Android应用程序的开发、调试和优化等方面。常见的面试题包括: 1. 什么是Android Framework? Android Framework是Android操作系统的核心组件之一,它提供了一系列API和工具,用于开发、调试和优化Android应用程序。 2. Android Framework的组成部分有哪些? Android Framework由四个主要组成部分组成:应用程序框架、系统服务、库和运行时环境。 3. 什么是Android应用程序框架? Android应用程序框架是Android Framework的核心组成部分,它提供了一系列API和工具,用于开发Android应用程序。应用程序框架包括四个主要组件:活动、服务、广播接收器和内容提供者。 4. 什么是Android系统服务? Android系统服务是Android Framework的一个重要组成部分,它提供了一系列系统级别的服务,如通知服务、位置服务、传感器服务等。 5. 什么是Android库? Android库是Android Framework的一个重要组成部分,它提供了一系列常用的功能和工具,如图形界面库、网络库、数据库库等。 6. 什么是Android运行时环境? Android运行时环境是Android Framework的一个重要组成部分,它提供了一系列核心库和虚拟机,用于执行Android应用程序。 7. 什么是Android应用程序的生命周期? Android应用程序的生命周期指的是应用程序从启动到关闭的整个过程,包括应用程序的创建、启动、暂停、恢复和销毁等阶段。 8. 什么是Android应用程序的四大组件? Android应用程序的四大组件包括:活动、服务、广播接收器和内容提供者。活动用于展示用户界面,服务用于在后台执行任务,广播接收器用于接收系统广播,内容提供者用于管理应用程序的数据。 9. 什么是Android应用程序的UI线程? Android应用程序的UI线程是指用于更新用户界面的线程,它负责处理用户界面的事件和更新UI组件。 10. 什么是Android应用程序的异步任务? Android应用程序的异步任务是指用于在后台执行任务的线程,它负责处理耗时操作,如网络请求、数据库操作等。 ### 回答2: Android Framework 是 Android 应用开发的核心部分,它是一组软件模块,为 Android 应用提供基本的服务和功能,包括视图系统、资源管理器、通知中心、系统 API 等等。以下是 Android Framework 面试题的回答: 1. 什么是 Android Framework?它有哪些组成部分? Android Framework 是 Android 应用开发的核心部分,它提供了一个标准化的架构,包括了一系列底层模块和服务,帮助开发者快速构建优质的应用程序。Android Framework 包括四个主要的组成部分: - Activity Manager:管理应用程序的生命周期、任务管理和应用程序调度。 - Content Provider:提供应用程序之间数据共享的机制。 - View System:提供视图组件的绘制和交互功能,包括 UI 组件、菜单、通知等。 - System API:提供开发者使用的系统级别 API,包括网络、存储、多媒体、传感器等各种功能。 2. 什么是 Intent? Intent 是在 Android 开发中用于启动组件、传递数据和执行操作的一种消息机制。Intent 由两个主要的部分组成,第一个是传递的动作行为(Action),用于指定所要执行的操作;第二个是传递的数据(Data),可包含要传递的信息、参数或操作。Intent 在 Android 应用中经常用于启动 Activity、Service、Broadcast Receiver,以及在应用程序之间传递数据。 3. 什么是 Content Provider? Content Provider 是 Android Framework 中的一项核心服务,用于提供跨应用程序数据共享的机制。Content Provider 可以通过 URI 的方式访问数据,并将一些特定的操作和查询暴露给外部应用程序。Content Provider 在 Android 应用中广泛应用于共享数据、存储和检索数据等功能。Content Provider 可以使用 SQLite 数据库存储数据,也可以使用其他数据源。 4. 什么是 Binder? Binder 是 Android Framework 中的一种进程间通信机制。它使用了一种名为跨进程通信 (IPC) 的技术,允许不同进程之间共享数据和资源,并可让应用程序在另一个进程执行功能。在 Android Framework 中,Activity 管理器、Service 和 Content Provider 等都是通过 Binder 与其他应用程序进行通信。Binder 还提供了一些高级功能,如安全性和线程管理。 5. 什么是 View System? View System 是 Android 应用程序中的 UI 组件,它提供了视图绑定、事件处理、资源管理和窗口布局等功能。在 Android Framework 中,View System 通过命名布局文件、使用 XML 描述视图和样式等机制,管理和绘制 UI 布局、界面组件和控件。View System 还提供了与其他系统服务的集成,如通知中心、扩展菜单、对话框等。 6. 什么是 Android Manifest? Android Manifest 是 Android 应用开发中必不可少的部分,它是应用程序清单文件,用于定义应用程序的基本信息和结构。Manifest 文件包含了应用程序使用的 Activity、Service、Broadcast Receiver 等组件,以及应用程序所需的权限和组件信息、应用程序元信息等。Manifest 文件还包括运行时动态创建的 Activity、Service 和 Receiver 的声明和权限标签,以及与应用程序的组件交互的 Intent 过滤器。 总结: Android Framework 是 Android 应用开发的核心,它提供了一组标准化的软件模块,为 Android 应用程序提供基本的服务和功能。通过对 Android Framework 的学习和理解,开发者可以更好地把握 Android 应用开发的核心技术,快速构建高质量的应用程序。 ### 回答3: Android framework在移动端操作系统中扮演了至关重要的角色,关系到整个Android系统的顺利运行和用户体验。以下是一些相关的面试题及其答案。 1. 什么是Android framework? Android framework主要指的是整个Android操作系统中的框架架构,包括组件、服务、库等等。它提供了一系列的API和开发者工具,使得应用程序设计者可以轻松地在上面开发、部署和调试应用程序。 2. Android framework中的四大组件是什么? Android framework中的四大组件包括Activity、Service、Content Provider和Broadcast Receiver。这些组件大都是基于事件驱动模型来设计的,通过系统的内部通信协议来实现各个组件之间的交互,以使得应用程序能够运行得更加高效、稳定和流畅。 3. Android framework中的应用程序包含哪些基本结构? Android framework中的应用程序包含了Activity、Manifest、布局文件、资源文件等等。其中,Activity是应用程序的基本单元,Manifest是整个应用程序的配置文件,而布局文件和资源文件则用于定义应用程序的用户界面和各种资源。 4. 什么是Android Intent? Android Intent是从一个组件(如Activity、Service、Broadcast Receiver等)向另一个组件传递消息的一种机制。Intent本身就是一个数据结构,其包含了一些元数据(如操作名称、数据URI、类别、组件名称、附加的Extras等),以及一些标志(如FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_SINGLE_TOP等)等。通过使用Intent,不同组件之间可以实现相互通信和交互。 5. Android中的View和ViewGroup有何区别? 在Android中,View代表着一个基本的GUI控件,如Button、TextView等,而ViewGroup代表着一个包含了多个View的容器,如LinearLayout、RelativeLayout等。简单来说,View是最基本、最简单的GUI控件,而ViewGroup则是一个可以包含多个View的容器。通过使用View和ViewGroup,应用程序可以创建出丰富、多样化的用户界面。 总之,掌握了以上的面试题及其答案,相信大家对Android framework的基础知识已经有了较为全面的认识。当然,Android framework作为一个十分庞大和复杂的系统,还有许多其他的知识点和技术需要我们进一步了解和掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值