2、什么情况下会让线程进入死亡状态:
1.线程中的代码执行完毕
2.执行线程的代码时抛出异常
3、线程的interrupt方法:简书
4、线程池:线程池的核心
5、当要在网络请求数据并渲染时,你会怎么做(在子线程获取数据,然后用接口将数据回调给UI线程)
但是在接口方法中,由于是子线程调用的该方法,所以该方法还是在子线程运行,所以在该方法中操作UI之前,需要先调用RunOnUIThread方法
6、handler是怎么从子线程切换到主线程的:
-
Handler的使用方式可以根据发送消息的方式不同而分为两种:
Handler.sendMessage()和Handler.post() -
Handler.sendMessage()方式:
在定义自己的Handler的时候重写Handler的handleMessage()方法来对拿到的消息进行处理,因此这个方法应该是运行在接收消息的线程的。(例如下载内容->更新UI,handleMessage()运行在主线程)。
一,创建Handler子类
1、自定义Handler子类,并重写handleMessage()方法
class mHandler extends Handler {
//重写handleMessage()方法
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//执行的UI操作 (在主线程执行)
}
}
2、主线程中创建mHandler的实例
private mHandler mhandler = new mHandler();
3、在子线程中创建需要发送的消息对象
Message msg = Message.obtain();
msg.what = 1;
4、在子线程中通过Hander发送消息到消息队列
mhandler .sendMessage(msg);
5、启动子线程
二、使用匿名Handler子类
1、在主线程中通过匿名内部类创建Handler类对象
Handler mhandler = new Handler(){
//重写handleMessage()方法
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//执行的UI操作 (在主线程执行)
}
};
2、在子线程中创建需要发送的消息对象
Message msg = Message.obtain();
msg.what = 1;
3、在子线程中通过Hander发送消息到消息队列
mhandler .sendMessage(msg);
4、启动子线程
- Handler.post()方式:
1、在主线程中创建Handler实例
private Handler mhandler = new Handler();
2、在子线程中使用Handler.post()
mhandler.post(new Runnable() {
@Override
public void run() {
//执行的UI操作 (在主线程执行)
}
});
3、启动子线程
- sendMessage方法需要在提前定义好要执行的UI操作,然后在得到子线程的相应信息时,在main线程执行该UI操作;但是post方法实用的多:可以在post方法中定义UI操作,然后自动在main执行
7、 主线程调用子线程去获取网络数据,当得到数据后,通过接口回到将子线程获取的到的数据传递给主线程:
- 用获取数据的类继承Callback.CommonCallback<String>接口,实现它的监听方法:监听网络数据的获取状态
8、关于线程安全、线程通信的代码(两个线程交替打印1到100)
9、haspmap的使用,下去操作一下
10、hashmap:红黑树的平均查找时间复杂度,改变为红黑树的目的(方便进行查找),红黑树的定义,hashmap扩容的过程 ,hashmap的使用,hashmap线程安全吗,怎么保证它的线程安全(分段锁)
11、自定义控件对应的三个方法对应的作用,三种布局模式在不同情况下的选择
二次:
1、对于实习你有什么诉求:希望在实习过程中可以转正并留在字节
2、说一下你的项目,涉及到的知识点
3、recycleView的原理: 简书 - 写文章 (jianshu.com)
4、finel关键字(对象加finel可以改变吗,finel类的内部变量可以改变吗(变量没有加finel),这是什么特性导致的)
5、变量有哪些类型
6、 == 与 equals的区别
7、Java中如何判断两个对象是否相等(Java equals and ==)
- 判断两个对象的路径名是否相同,然后在判断两个的类加载器是否相同
8、字符串内部是有数组进行实现的,保存字符的数组:String为什么不可变
- string类的成员变量:value[ ] 、offset、count、hash,这些成员变量都是用 private finel 修饰的,所以外部无法访问他们的set方法,他们在创建之后也没办法再改变。
- value是String封装的数组,offset是String在这个value数组中的起始位置,count是String所占的字符的个数。 还有一个hash成员变量,是该String对象的哈希值的缓存
- value实际是一个字符数组,我们对string修改值时,实际是修改了value数组的指向
- 用反射可以访问string内部的私有变量,可以真正的改变string的值
9、string a = "yk" 与 string b = new sting("yk")的区别
10、string这个类是线程安全的吗
11、java中的异常类有哪些(具体点),空指针属于哪种异常
12、垃圾回收算法有哪些;引用计数有什么问题吗
- 会造成循环引用
- 无法区分强、软、弱、虚引用
13、activity的启动模式有哪些
14、自定义控件,为什么要自定义控件
15、怎么从手机里面加载一张图片(bitmap类)
- Android程序去手机相册获取图片:
1、通过隐式跳转到相机,选择一张图片后返回,然后回到onActivityResult方法中
1、定义一个资源标识符接收onActivityResult方法传递回来的数据
2、然后用contentResolver和uri创建一个数据流
3、用BitmapFactory的解析这个输入流
4、最后将解析过后的输入流设置到图片上去
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
// 相册
IMAGE_CODE -> {
if (resultCode != Activity.RESULT_CANCELED) {
val uri: Uri? = data?.data
Log.v("yk", "你好啊: $data")
Log.v("yk", data?.data.toString())
uri?.let {
contentResolver.openInputStream(uri).use {
BitmapFactory.decodeStream(it).apply {
// 显示图片
ykImage.setImageBitmap(this)
// 缓存图片: 创建保存图片的文件
var file = File(filesDir, "header.jpg")
FileOutputStream(file).also { yk2 ->
// 将图片保存到对应的路径中
compress(Bitmap.CompressFormat.JPEG, 50, yk2)
}
}
}
}
}
}
- 从文件中获取图片:
// 获取头像图片(下一次进入程序时,去获取图片)
File(filesDir, "header.jpg").also {
if (it.exists()) {
BitmapFactory.decodeFile(it.path).also { yk ->
ykImage.setImageBitmap(yk)
}
}
}
}
16、计算机网络:三次握手、四次挥手(具体到指令)、tcp udp的区别及应用情景;为什么是三次、四次;网络状态码(具体到单位)
17、进程和线程的区别
18、并发和并行(单核和多核角度来讲),32位的操作系统可以最大可以支持多大的内存
19、设计模式(代码实现、作用)、编码原则: 简书 - 写文章 (jianshu.com)
网友评论