美文网首页
猕猴桃面试

猕猴桃面试

作者: zhi5ai | 来源:发表于2017-10-25 21:58 被阅读18次

    -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优化

    1. 数据分页加载
    2. 滑动时,不加载,滑动停止时,只加载当前页面数据

    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无法再次接收到事件。

    相关文章

      网友评论

          本文标题:猕猴桃面试

          本文链接:https://www.haomeiwen.com/subject/dticpxtx.html