猕猴桃面试

2017-10-25  本文已影响18人  zhi5ai

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

上一篇下一篇

猜你喜欢

热点阅读