안드로이드 면접-2015-4-29-권피망과학기술유한공사

18532 단어 android
오늘 면접은 심천권피인터넷과학기술유한공사에 가서 면접을 봅니다. 면접관은 여자이고 미인이라고 할 수 있습니다. 그래요. 면접이 끝난 후에 저는 이상을 제외하고는 여재자+여장부의 종합체가 되어야 한다고 생각합니다.
다음은 면접과 관련된 질문과 자신이 앞으로 개선해야 할 점을 기록한다.
우선, 오랫동안 면접을 보러 나가지 않았기 때문에 면접 과정에서 약간의 노출이 있을 수 있다.
그 다음으로 확실히 기술적인 면에서 남보다 못한 점이 있다. 이것은 앞으로 업무에서 가능한 한 빨리 보완해야 한다.
셋째, 업무 중에 부족한 것을 발견하는 것 외에 시간을 차단하고 면접을 보러 나가야 할 수도 있다. 좋은 회사에 면접을 보지 않아도 대신/아줌마에게 혼나는 것이 좋다. 어차피 자신이 부족하다는 것을 알면 보완하고 기술적인 향상과 발전 방향을 확정할 수 있다.
 
지금까지 깨달음은 기술적인 부분과 관련이 있습니다.
1, Listview 최적화 관련?
(1) 우선viewHolder를 통해convertview 캐시를 실현한다.
(2), 다양한 type 처리: getItemType()와 getviewTypeCount()를 다시 불러오고 getview에서 switch는 서로 다른 레이아웃을 전환하고 서로 다른holder를 전환한다. 서로 다른item에 따라.type 설정 UI에 표시되는 내용입니다.
(3) 로드 소모 시간, 매번 라인을 열지 말고 가능한 한 라인 탱크를 사용하여 라인을 여는 것을 대체한다.
(4) Listview 스크롤은 그림 로드를 중지합니다.
umloader를 사용하는 경우
ImageLoader의pauseonscrolllistener 방법을 사용하면listview 슬라이딩 정지 후 그림을 불러올 수 있습니다. 이것은 카드를 해결하는 좋은 방법입니다.
private void applyScrollListener() {
 
//pauseOnsceoll pauseOnFling    true,              
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
}

  2.ImageLoader를 구성할 때 사용하지 않습니다.memoryCache(new LruMemoryCache(2 * 1024 * 1024) 또는.memory Cache (new Weak Memory Cache () 는listview가 미끄러울 때 그림이 정확하게 표시됩니다. 다시 불러올 필요가 없습니다. 캐시 생명주기가 길어져서 모든 그림을 메모리에서 직접 읽을 수 있고 속도가 빠르겠죠.
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) .
threadPoolSize(3).
threadPriority(Thread.NORM_PRIORITY - 1).
denyCacheImageMultipleSizesInMemory().
discCacheFileNameGenerator(new Md5FileNameGenerator()).
tasksProcessingOrder(QueueProcessingType.LIFO).
discCacheExtraOptions(240, 400, CompressFormat.PNG, 40,null).
memoryCacheExtraOptions(240, 400).
discCacheFileCount(1000).
writeDebugLogs().
defaultDisplayImageOptions(doGetOptions()).
build();
ImageLoader.getInstance().init(config);

 
   (5).listview의xmlmatch 로 설정할 구성parent 대신 Wrap콘텐츠, 이것도listview의 유창도에 영향을 줍니다
android:layout_width="match_parent"
android:layout_height="match_parent"

(6) adapter의 getview ()에서 모든 item의 기본 그림을 설정하려면 사용하십시오.setImageResource() 대신.setBackgroundResource()
(7)Listview 그림이 흐트러진 문제는 convertView의 재사용 메커니즘 때문에 발생한 것으로 해결 방법: tag를 그림Url로 설정
 
2. 프로세스 간 통신은 AIDL 외에 어떤 방식으로 이루어집니까?
AIDL 외에도 라디오와 콘텐츠 Provider가 있는데 뒤에 두 개가 대답을 못했는데 주로 깊이가 없었을 거예요.
3, Activity 네 가지 시작 모델은 이론을 제외하고 실제 업무에서의 사용을 말합니까?
standard: 기본 모드입니다. 설정을 쓰지 않아도 됩니다.이 모드에서는 기본적으로 새로운 실례를 만들 것입니다.따라서 이 모드에서는 여러 개의 동일한 실례가 있을 수도 있고 여러 개의 같은Activity가 중첩될 수도 있다.
singleTop: 여러 개의 실례가 있을 수 있지만, 같은 Activity를 여러 개 중첩하는 것은 허용되지 않습니다.즉, Activity가 창고 위에 있을 때 같은 Activity를 시작하면 새로운 실례를 만들지 않고 onNew Intent 방법을 호출합니다.
singleTask: 인스턴스가 하나뿐입니다.같은 프로그램에서 그를 시작할 때,Activity가 존재하지 않으면 현재task에서 새로운 실례를 만들고, 존재하면task에 있는 다른Activity destory를 제거하고 onNew Intent 방법을 호출합니다.다른 프로그램에서 시작하면,task를 새로 만들고,task에서 이Activity를 시작합니다.singleTask에서는 다른Activity가 하나의task와 공존할 수 있도록 합니다. 즉, 이singleTask의 실례에서 새로운Activity를 열면,이 새로운Activity는singleTask의 실례의task에 있습니다.
singleInstance: 하나의 실례만 있고, 이 실례는 하나의task에서 독립적으로 실행됩니다. 이task는 이 실례만 있고 다른Activity가 존재하는 것을 허용하지 않습니다.
4,viewPager+fragement는 처음 로드하고 두 번째는 로드하지 않습니까?
 
5,Listview 드롭다운 리셋, 위로 당기기 로딩은 어떻게 실현됩니까? 코드 각도에서 말합니까?
드롭다운 데이터 새로 고침 - 기능 분석 1을 실현하고ListView의hearder 헤드 레이아웃을 추가합니다
1), 위쪽 레이아웃 파일 헤드를 씁니다.xml2), 리스트 항목으로 사용되며 초기화할 때 헤더 3을 추가하기 편리하도록 사용자 정의), Layout Inflater를 통해 상단 레이아웃 파일head를 가져오는 뷰 헤더를 정의합니다.xml 4),listview를 통해.addHeaderView(header)를 사용하여 ListView에 헤드 레이아웃 추가
5), LayoutParams는 Layout의 위치, 높이, 너비 등 정보를 봉인하는 Layout의 정보 패키지에 해당한다.만약에 하나의 View를 Layout에 추가하면 Layout 사용자가 원하는 레이아웃 방식, 즉 인정받는layoutParams를 전달하는 것을 알려주는 것이 가장 좋다.Android의 UI 인터페이스는 View와 View Group 및 파생 클래스를 조합하여 구성되며 컨테이너로서의 View Group은 잎 노드로서의 View를 포함할 수 있습니다.더 낮은 차원의 하위 뷰 그룹 getLayoutParams도 포함할 수 있습니다. 레이아웃 파라미터의 인용을 makeMeasureSpec () 로 되돌려줍니다. 제공된 크기와 패턴을 바탕으로 MeasureSpec 값을 되돌려줍니다.
 
2. ListView의 onScrollListener () 이벤트를 감청하고firstViewItem에 따라 맨 위에 있는지, 현재 첫 번째로 보이는 item 위치를 판단합니다.
3. ListView의 onTouch() 이벤트를 누르고 이동하며 들어올리고 내리고 놓고 정상적인 상태에서 제어 동작을 감청하여 현재 맨 위에 있는 레이아웃의 제어 상태와 내용 표시를 변경한다.
4. 인터페이스 리셋을 통해 리셋/리셋을 완성하고 더 많은/더 많은 완성된 방법을 불러와Activity가 호출할 수 있도록 합니다.
본 글 공유하기http://www.cnblogs.com/likeandroid/p/4445455.html
6, Umloader 베이스에서 그 알고리즘에 이르기까지 구체적으로 몇 가지를 말씀해 주시겠어요?
 
이것은 내가 LRU 알고리즘을 말했지만 자세히 말하지 않았다.
LinkedHashMap 선진적인 체인 테이블 구조로 저장 순서를 기억할 수 있습니다. 저장할 때 캐시가 구조 방법으로 전송된 캐시 크기를 초과했는지 판단하고 초과되면 가장 먼저 삽입된 내용을 삭제합니다.
메모리 캐시 기술은 응용 프로그램의 귀중한 메모리를 많이 차지하는 그림에 빠른 접근 방법을 제공합니다.그 중에서 가장 핵심적인 클래스는 LruCache(android-support-v4 패키지에서 제공)이다.이 클래스는 그림을 캐시하는 데 매우 적합하다. 이 클래스의 주요 알고리즘 원리는 최근에 사용한 대상을 링크드 HashMap에 강한 인용으로 저장하고, 최근에 가장 적게 사용한 대상을 캐시 값이 미리 설정된 값에 도달하기 전에 메모리에서 제거하는 것이다.
과거에 우리는 소프트 참조나 약한 참조(Soft Reference or Weak Reference)라는 매우 유행하는 메모리 캐시 기술의 실현을 자주 사용했다.그러나 이제는 이런 방식을 추천하지 않는다. 안드로이드 2.3(API Level 9)부터 스팸 수거기는 소프트 인용이나 약한 인용을 가진 대상을 회수하는 경향이 강해져 소프트 인용과 약한 인용이 더 이상 신뢰할 수 없기 때문이다.또한 Android 3.0(API Level 11)에서 그림의 데이터는 로컬 메모리에 저장되기 때문에 예견할 수 있는 방식으로 방출할 수 없기 때문에 잠재적인 위험이 있어 응용 프로그램의 메모리가 넘치고 붕괴될 수 있다.
LRU 알고리즘 코드:
public class LruMemoryCache implements MemoryCache {

    private final LinkedHashMap<String, Bitmap> map;

    private final int maxSize;//     byte
    /** Size of this cache in bytes */
    private int size;//       

    /** @param maxSize Maximum sum of the sizes of the Bitmaps in this cache */
    public LruMemoryCache(int maxSize) {
        if (maxSize <= 0) {
            throw new IllegalArgumentException("maxSize <= 0");
        }
        this.maxSize = maxSize;
        this.map = new LinkedHashMap<String, Bitmap>(0, 0.75f, true);
    }

    /**
     * Returns the Bitmap for {@code key} if it exists in the cache. If a Bitmap was returned, it is moved to the head
     * of the queue. This returns null if a Bitmap is not cached.
     */
    @Override
    public final Bitmap get(String key) {
        if (key == null) {
            throw new NullPointerException("key == null");
        }

        synchronized (this) {
            return map.get(key);
        }
    }

    /** Caches {@code Bitmap} for {@code key}. The Bitmap is moved to the head of the queue. */
    @Override
    public final boolean put(String key, Bitmap value) {
        if (key == null || value == null) {
            throw new NullPointerException("key == null || value == null");
        }

        synchronized (this) {
            size += sizeOf(key, value);
            Bitmap previous = map.put(key, value);
            if (previous != null) {
                size -= sizeOf(key, previous);
            }
        }

        trimToSize(maxSize);
        return true;
    }

    /**
     * Remove the eldest entries until the total of remaining entries is at or below the requested size.
     *
     * @param maxSize the maximum size of the cache before returning. May be -1 to evict even 0-sized elements.
     */
    private void trimToSize(int maxSize) {
        while (true) {
            String key;
            Bitmap value;
            synchronized (this) {
                if (size < 0 || (map.isEmpty() && size != 0)) {
                    throw new IllegalStateException(getClass().getName() + ".sizeOf() is reporting inconsistent results!");
                }

                if (size <= maxSize || map.isEmpty()) {
                    break;
                }

                Map.Entry<String, Bitmap> toEvict = map.entrySet().iterator().next();
                if (toEvict == null) {
                    break;
                }
                key = toEvict.getKey();
                value = toEvict.getValue();
                map.remove(key);
                size -= sizeOf(key, value);
            }
        }
    }

    /** Removes the entry for {@code key} if it exists. */
    @Override
    public final Bitmap remove(String key) {
        if (key == null) {
            throw new NullPointerException("key == null");
        }

        synchronized (this) {
            Bitmap previous = map.remove(key);
            if (previous != null) {
                size -= sizeOf(key, previous);
            }
            return previous;
        }
    }

    @Override
    public Collection<String> keys() {
        synchronized (this) {
            return new HashSet<String>(map.keySet());
        }
    }

    @Override
    public void clear() {
        trimToSize(-1); // -1 will evict 0-sized elements
    }

    /**
     * Returns the size {@code Bitmap} in bytes.
     * <p/>
     * An entry's size must not change while it is in the cache.
     */
    private int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight();
    }

    @Override
    public synchronized final String toString() {
        return String.format("LruCache[maxSize=%d]", maxSize);
    }
}

 
7. 디자인 모델은 몇 가지에 쓰입니까? 구체적으로 사용하시겠습니까?
이것은 당시에 단례만 언급했다. 내가 당시에 말한 것은 데이터베이스 조작 클래스가 단례로 설정되어 있어서 매번 new 대상에 갈 필요가 없다. 그러나 단례 모델이 어떤 사상을 구현했는지 물었을 때 나는 얼떨떨해졌다.
관찰자 모드 - 객체 간의 일대다 의존 관계를 정의하며, 객체의 상태가 변경되면 그에 의존하는 모든 객체가 공지를 받고 자동으로 업데이트됩니다.이런 모델은 우리가 익숙한 이벤트 구동 모델에서 가장 많이 사용된다. 예를 들어 VC, 안드로이드 인터페이스의 이벤트 응답은 바로 관찰자 모델을 바탕으로 실현하는 것이다.
예를 들어 버튼의 클릭 이벤트는 관찰자의 디자인 모델을 통해 이루어진다. set OnClickListener() 방법은 관찰자를 등록하는 것이고 Button 대상은 우리가 관찰해야 할 목표 대상이다.그리고 new에 나온 OnClickListener()는 바로 우리의 실제 관찰자다.
정책 모드 --- 일련의 알고리즘을 정의하여 독립적으로 봉인하고 이 알고리즘들 사이를 서로 바꿀 수 있다.전략 모델은 주로 공통된 알고리즘을 관리하는데 클라이언트는 수요에 따라 이 알고리즘을 신속하게 전환하고 확장성을 유지할 수 있다.
안드로이드에서의 응용 - 다음은 안드로이드에서의 응용 프로그램에 대해 말씀드리겠습니다.안드로이드에서 정책 모드의 전형적인 응용 프로그램 중 하나는 바로 어댑터이다. 우리가 평소에 사용할 때 일반적인 상황에서 우리는 Base어댑터를 계승한 다음에 서로 다른 뷰를 되돌려주고 GetView에서 서로 다른 알고리즘을 실현할 수 있다.외부에서 사용할 때도 서로 다른 데이터 원본에 따라 다른 어댑터를 전환할 수 있다.
Fragement의 실제 사용 사례http://www.cnblogs.com/androidsuperman/p/4471336.html.
다른 디자인 모델은 제가 쓴 디자인 모델 관련 블로그와http://gqdy365.iteye.com/blog/2122794
신이 뒤에 있는 평론에서 조언을 해주시거나 관련 지식을 저에게 연결해 주셨으면 좋겠습니다. 제가 공부를 잘하면 감사하겠습니다.

좋은 웹페이지 즐겨찾기