-1. 简单自我介绍
-......(一通废话)
-2. 最新开发的一个哎呦齿是什么
(说的可能是应用?)
-最新写得是一个聊天应用,后台是firebase。
-后台是php.
-Firebase. firebase。。
-Firebase!?
-对。
(。。直接问第三个问题😓怨我喽)
-3. 嗯,****,这个是一个什么app啊?
-一通介绍
-这里面我看你写这个retrofit,okhttp,这些东西你源码看过吗?
-源码,没看过。有问题的时候,会看,但没专门看过。
-OkHttp拦截器你了解吗?
-不了解。
-额,RxJava你有详细了解过吗?
-我了解过。
-那RxJava里的map,flatmap有什么区别
-map是数据类型转换,flatmap是稍微复杂点的处理。
-map,flatmap是操作符,不是数据类型
-对,map是经常做一些类型的转换。
-额,,那flatmap呢?
-稍微复杂点的逻辑操作吧(解释不清了😭)
-什么叫稍微复杂点儿的?
-一般类型转换,就用map。需要对这个数据做一些其他的操作,处理,就flatmap
-4. recyclerView的优化你了解过吗?
-recyclerView,优化。。
-一般比如说很多图片的时候,这种情况怎么做一些优化的?
-你说是先下载一部分,等下滑的时候再下载一部分这张优化吗?
....一顿喂喂喂,找信号中
-你说有什么优化
-就是,如果你的item太多的时候,你就先下载一个列表的图片,等到你有滑动的时候,再下载一组。不是你全部一次全下载了。
-只有这一点吗?
-还有什么?一般(本能反问,能问出个毛儿啊。。我可以送个listView优化,是convert View?都不用listView了。。)
-还有别的吗?
-别得,我不知道。我没。。
-5. 那,那个Android的那个,Activity的launchMode能说一下吗?
-launchMode啊,有四种模式。标准模式,就是活动A,再开一个活动B,再开一个活动A,还要建一个它的实例。但如果是。。top...什么top来着...
-什么Top啊?
-(一番思索)singleTop,是singleTop,对,singleTop的话就不用,最顶层是活动A,就不用新建A实例。然后singleTask,如果任务里有,就可以把它置顶,上面的给弹出去,就不用新建
-什么叫弹出去?
-啊?删掉。
-删掉?怎么删掉?
-比如说活动A,活动B,再活动C。你又要到活动A的时候,你就直接把活动B,活动C删掉。直接把底部的活动A置顶
-额,那singleTop和singleTask有什么区别?
-什么,singleTop和single什么?(真不敢相信自己的耳朵,要我回答个花儿出来吗?)
-Task.
-singleTop是顶部,singleTask是任务栈内,有的话就置顶。top的话,就是顶部有的话,就不用新建。
6. -嗯。。那个Handler机制能说下吗?
-handler机制啊,handler机制就是解决多线程问题。hander用sendMessage,发送信息那个到MessageQueue,然后再用handler从MessageQueue取信息来处理。然后AsyncTask就是对Handler机制的...那个封装
-什么?!对它的封装?
-这个。。不是,处理那个多线程的问题(磕巴的吓到,我可没看过底层,就知道AsyncTask是对Handler的封装。。。)都是处理多线程问题的方法
-对它的一个封装?你是这样理解的?
-对,我是这样理解的。(强装镇定...)
-嗯。。。
-就是它,内层应该是这样写的,我记得在哪看过,是这样。。(我还是相信自己不是记忆错乱)
7-那个,你说一下View点击事件的传递吧。
-View事件点击的传递的?(斯巴达中,我只记得一个onTouchEvent,单词失忆症啊)
-对,它是怎么做这个事件的分发,事件传递。
-事件分发机制啊。我只..
-对对对
-有三个函数
-嗯
-分发,拦截,和处理。但是...
-具体函数名是什么?
-函数名啊,dispatch,还有就是inter......我没用过,但我看过,但印象有点儿模糊(是非常模糊啊,心中有个intercept,但不敢确定啊,英语渣啊)
-没用过?!(很震惊啊!!)
-我没用过dispatch...就是那个拦截和分发,我有用到onTouchEvent。我写的一个在TextView中选中一个text,获取它的释义的时候,有用到onTouchEvent。另外两个没有用到过。(应该说没有重写过??)
-行行行,好,行,(是被吓到了吗?)那我大概知道了,行,今天的电话面试就到这儿吧。好吧!
-嗯,好。
-行,谢谢啊!
-嗯,谢谢。
然后,尴尬的结束
预测通过率:0.0002%
Retrofit,OkHttp,源码----再说吧
OkHttp拦截器
RxJava里的map和flatmap的区别
ReactiveX-操作符
map:事件对象的直接变换。一对一转换(ex. 事件的参数类型有String转换成一个Bitmap)
flatMap:使用传入的事件对象创建一个Observable对象。一对多,多对多转换
以下为项目中对RxJava的运用
compositeDisposable.add(imageService.downloadImage(imageList.get(i))
.flatMap(new Function<Response<ResponseBody>,ObservableSource<?>>() {
@Override
public ObservableSource apply(Response<responseBody> responseBodyResponse) throws Exception {
if(responseBodyResponse.isSuccessful()){
returnObservable.just(saveImageToLocal(responseBodyResponse.body()));
}else{
//when download failed
Image image =newImage();
images.add(image);
return Observable.just("download failed");
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(o -> refresh()));
获取释义
compositeDisposable.add(wordService.getDefinition(word)
.map(jsonObjectResponse -> jsonObjectResponse.body().get("data"))
.flatMap(this::parseJson)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<Definition.DataBean>() {
@Override
public void onNext(Definition.DataBean dataBean) {
if(dataBean.getContent()==null)
{
//can not find any definition
tipText.setText(getSelectedText());
tipDefinition.setText("未找到任何释义");
}else {
String content = dataBean.getContent();
String pron = dataBean.getPronunciation();
String defi = dataBean.getDefinition();
String audio = dataBean.getAudio();
tipText.setText(content);
tipPron.setText(pron);
tipDefinition.setText(defi);
// mediaPlayer = MediaPlayer.create(ActionModePopupActivity.this, Uri.parse(audio));
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(audio);
mediaPlayer.prepare();
// mediaPlayer.prepareAsync();
}catch (Exception e){
Log.i("play_error",e.toString());
}
RxView.clicks(tipAudio).subscribe(o -> playMedia());
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}));
parseJson
private Observable<Definition.DataBean> parseJson(JsonElement jsonElement){
return Observable.create(new ObservableOnSubscribe<Definition.DataBean>() {
@Override
public void subscribe(ObservableEmitter<Definition.DataBean> e) throws Exception {
Gson gson = new Gson();
Definition.DataBean dataBean = gson.fromJson(jsonElement, Definition.DataBean.class);
e.onNext(dataBean);
}
}).subscribeOn(Schedulers.newThread());
}
RecyclerView优化
- 数据分页加载
- 滑动时,不加载,滑动停止时,只加载当前页面数据
Handler机制
Android消息机制,也就是Handler机制,主要用于UI线程和子线程之间交互。
View的事件分发机制
MotionEvent,即点击事件。
所谓点击事件的事件分发,其实就是对MotionEvent事件的分发过程,即当一个Motion Event产生以后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程。
点击事件的分发过程有三个很重要的方法来共同完成:dispatchTouchEvent,onInterceptTouchEvent和onTouchEvent。
public boolean dispatchTouchEvent(MotionEvent ev)
用来进行事件的分发。如果事件能够传递给当前的View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的diapatchTouchEvent方法的影响,表示是否消耗当前事件。
public boolean onInterceptTouchEvent(MotionEvent event)
在上述方法内部调用,用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件。
public boollean onTouchEvent(MotionEvent event)
在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件。
网友评论