安卓面试问题

Handler

异步消息处理主要分为四个部分
1.Message
线程之间传递的消息
Message.what
Message.arg1
Message.arg2
Message.obj
2.Handler
消息的处理者,用于发送和处理消息
发送:handler.sendMessage(message)
处理:handleMessage()
3.MessageQueue
消息队列的意思
用于存放所有Handler发送的消息,每个线程只会有一个MessageQueue对象
4.Looper
每个线程中MessageQueue的管家,调用Looper的loop()方法后进入一个循环,每当发现MessageQueue存在消息时就将它取出,传递到Handler的handleMessage()方法中,每个线程也只会有一个Looper对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nV4nPc8f-1649829768308)(在这里插入图片描述)]](https://img-blog.csdnimg.cn/96c856d300554757a564c29985fa6064.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc–8jTAxMDEwMQ==,size_20,color_FFFFFF,t_70,g_se,x_16)

public class MainActivity extends Activity implements OnClickListener {
    
    
    public static final int UPDATE_TEXT = 1;
    private TextView text;
    private Button changeText;
    private Handler handler = new Handler() {
    
    
        public void handleMessage(Message msg) {
    
    
            switch (msg.what) {
    
    
                case UPDATE_TEXT:
                    text.setText("Nice to meet you");
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.text);
        changeText = (Button) findViewById(R.id.change_text);
        changeText.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
    
    
        switch (v.getId()) {
    
    
            case R.id.change_text:
                new Thread(new Runnable() {
    
    
                    @Override
                    public void run() {
    
    
                        Message message = new Message();
                        message.what = UPDATE_TEXT;
                        handler.sendMessage(message);
                    }
                }).start();
                break;
            default:
                break;
        }
    }
}

AsyncTask

对异步消息处理进行了封装
AsyncTask是一个抽象类,需要创建一个类继承它

实现AsyncTask类需要重写四个方法
1.onPreExecute()
在后台任务开始之前调用,用于一些界面上的初始化操作,比如显示一个对话框
2.doInBackground()
这个方法的所有代码都会在子线程中运行,我们在这里处理一些耗时的任务,不能进行UI操作,如果需要更新UI,可以调用publishProgress()方法完成
3.onProgressUpdate()
在后台任务调用publishProgress()后onProgressUpdate()方法就会很快被调用,该方法携带的参数是后台任务传递过来,可以对UI进行相关操作,利用参数中的数值可以对界面元素进行相应的更新。
4.onPostExecute()
当后台任务执行完毕并且通过return语句进行返回时,这个方法很快会被调用,返回的数据会作为参数传递到此方法中,可以利用·返回数据进行一些UI操作,比如提醒任务执行结束,关闭进度对话框等。

在doInBackground()方法中执行耗时操作,在onProgressUpdate()方法中进行相关UI操作(页面上一些即使操作),在onPostExecute()方法中执行一些任务的收尾工作。

启动:new DownloadTask().execute();

进程

系统分配资源的最小单位

前台进程:即与用户正在交互的Activity或者Activity用到的Service等,如果系统内存不足时前台进程是最后被杀死的
可见进程:可以是处于暂停状态(onPause)的Activity或者绑定在其上的Service,即被用户可见,但由于失去了焦点而不能与用户交互.
服务进程:其中运行着使用startService方法启动的Service,虽然不被用户可见,但是却是用户关心的,例如用户正在非音乐界面听的音乐或者正在非下载页面自己下载的文件等;当系统需要空间运行前两者进程(–>指的是前台进程和可见进程)时才会被终止.
后台进程:其中运行着执行onStop方法而停止的程序,但是却不是用户当前关心的,例如后台挂着的QQ,这样的进程系统一旦没了有内存就首先被杀死.
空进程:不包含任何应用程序的程序组件的进程,这样的进程系统是一般不会让他存在的,为了进行缓存,使下次App启动的时候更快,当系统需要内存是最先被杀死.

线程

执行任务的最小单位

程序运行时会创建一个主线程运行应用程序,主线程又叫UI线程,负责UI组件和应用程序的交互,如果在主线程中进行网络或数据库请求等耗时操作,会导致线程阻塞,主线程无法调度分发事件和任务,超过五秒会使系统无法响应弹出ANR窗口

Java反射

1、获取Class对象
1.1 Object ——> getClass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过Class类的静态方法:forName(String className)(常用)

2、通过反射获取构造方法并使用

3、获取成员变量并调用

4、获取成员方法并调用

5、反射main方法

6、反射方法的其它使用之—通过反射运行配置文件内容

7、反射方法的其它使用之—通过反射越过泛型检查

猜你喜欢

转载自blog.csdn.net/m0_46527751/article/details/124146190