A. 百度android面試題之如何停止一個線程
有三種方法可以結束線程:
1. 使用退出標志,使線程正常退出,也就是當run方法完成後線程終止
2. 使用interrupt()方法中斷線程
3. 使用stop方法強行終止線程(不推薦使用,可能發生不可預料的結果)
前兩種方法都可以實現線程的正常退出,也就是要談的優雅結束線程;第3種方法相當於電腦斷電關機一樣,是不安全的方法。
B. android 多線程問題
為何要調用getParent(),直接傳你那個Activity.this,parent是空指針。
C. 多線程面試題,沒有思路。還請達人指點。
這樣吧,我是根據前面同學的思路以生產者-消費者方式完成的一個java小demo。
第一個類:
共享值類。
public class ShareValue {
private int count;
public ShareValue(int count) {
this.count = count;
}
public synchronized void plus() throws InterruptedException {
if (count <= 100) {
++count;
System.out.println("Procer:" + count);
this.notifyAll();
} else {
System.out.println("值超過100,停止增加!");
this.wait();
}
}
public synchronized void minus() throws InterruptedException {
if (count > 0) {
--count;
System.err.println("Consumer:" + count);
this.notifyAll();
} else {
System.out.println("值小或等於0,停止減少!");
this.wait();
}
}
}
第二個類:
生產者類
public class Procer implements Runnable {
private ShareValue value;
public Procer(ShareValue value) {
this.value = value;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
try {
value.plus();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
第三個類:
消費者類
public class Consumer implements Runnable {
private ShareValue value;
public Consumer(ShareValue value) {
this.value = value;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
try {
value.minus();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
第四個:
測試類
public class TestPC {
public static void main(String[] args) {
ShareValue value = new ShareValue(0);
Runnable pr = new Procer(value);
Runnable cr = new Consumer(value);
new Thread(pr).start();
new Thread(cr).start();
}
}
希望對你有所幫助,這只是能初步跑起來,可以觀察運行,後面可以逐步調整。
D. android開發面試題:android 4.0以上版本需要注意哪些問題
不能在主線程進行網路請求
E. android 面試作品
關注Android已經很久了,去年Android職位還是寥寥無幾,現在已經如雨後春筍一般涌現,去各招聘網站,在職位一欄里輸入Android關鍵字,你將會發現有很多的空缺職位.這無疑給廣大程序員帶來了新的機遇,你只要有半年或者一年相關Android相驗你會很搶手.我相信只要你投簡歷,我不敢說每投必"應",最起碼十有四五的概率還是有的.
那麼每個公司招聘Android開發人員,到底看重什麼呢,下面我將以個人的觀點,講一下應聘Android開發人員應該具備的條件.
說實話,對於搞過java的程序員來說,轉到android是一件很容易的事,兩三個月研究研究就足已了,世面上的android書買一本入入門就OK了,做Android應用個人認為比較簡單,但是有創意的還是比較難的.如果你只是想做簡單的android應用開發人員,你只要准備一下Java知識(多線程,Socket通信等),然後在對Android略知一二(如Android架構,Activity的理解,以及一個應用的生命周期等等).這些我相信可以應付過去了.
但是如果你想做更底層的開發,比如嵌入式開發(Android驅動開發等),那麼你就要懂得多一些知識了,畢竟這年頭Arm+Android還是很有搞頭的.這個你就要懂linux,Arm,C,C++等知識了,畢竟這方面的要求還是蠻高的.大家可以買個arm開發板,然後自己把android移植進去,做一些驅動開發,和應用開發,這樣你去應聘直接把你的東西帶過去,還是更有說頭的.
F. 關於android面試題,求解!
像素數組int[]data里就是一個個像素的顏色值,你循環和0xffffffff比較,如果相等,那麼就把這個值換成0x88ffffff就行了,這樣像素數組里所有的白色不透明(0xffffffff)都變成的半透明
G. 怎麼准備Android面試
總體上來說可以分為兩種類型,小公司注重你的實踐能力,大公司看中你的綜合能力。小公司面試會比較集中安卓開發這一塊,比較在意你之前有沒有類似的項目經驗,有沒有遇到過目前他們所遇到的一些問題,准備這類公司面試除了基本的一些知識點還需要關注一些安卓開發實際中經常遇到的一些問題,諸如圖片緩存,常見的開源框架,oom問題等等。大公司面試比較在意你的綜合能力,無外乎是數據結構與演算法,計算機網路,操作系統,Java這。我想說在我列出的這么多考查點中,數據結構與演算法是一個分水嶺,這個的准備需要一個長時間的積累,真正的高手與一般人一試就知道,屢試不爽,所以很多公司都痴迷於考演算法,像是美團,網路,愛奇藝等公司,總共整個面試下來可以讓你手寫5個演算法題以上,我說這么多隻想告訴你這是一個門檻,能不能跨過去決定了你最終所找工作的水準,所以我都會建議每一個找程序員相關工作的人,這一塊要盡早准備,多刷一些leetcode或是其他類似的題。然後在剩下的幾塊知識中,我只想說你可以不用全部都懂,但是你必須要在某一塊知識點是有深入研究的,能夠回答面試官4到5個追加問題,如果所以知識點都只能答上一到兩個,面試官會覺得你的水平就是這樣了,另外也會覺得你沒有探究精神,關於後面一點是很恐怖的沒有探究精神做不了好的程序員。如果按照重要程度,面試安卓我覺得可以做一個這樣的排序:數據結構與演算法,java,安卓,計算機網路,操作系統,後面是資料庫或是設計模式之類的。java這一塊比較重要的是多線程同步非同步,java虛擬機內存回收,容器,面向對象一些知識點。就單單是多線程和虛擬機都可以看好幾本專門講解的書了,其他知識點就多啃啃java編程思想,遇到不懂在多翻翻博客加深理解。安卓這一塊,非同步機制,view的繪制,自定義控制項,四大組件都非常重要。不管是android或是java都最好看一些源碼,java可以看一些容器的源碼,android可以看handler,looper,message等非同步通信的源碼或是一些開源框架的源碼,會看源碼絕對是加分項。計算機網路可以注重看上面幾層,傳輸層注重研究。一般來說,前面這幾點掌握好了,足以聊好幾輪面試,一般面試官你都可以引導他去聊一些你擅長的知識點。後面幾塊知識點,你可以先掌握一些比較重要的,不一定每次面試都會遇到,但是也得准備。
我只提供一些大概的思路,具體到沒一塊知識點怎麼准備可以自己去搜集,大的方向對了加上好的執行力一般可以取得不錯的結果,祝好!
2016.03.14更新,加一些具體的准備建議:
上面這幾塊知識點,按照其重要程度排序,我個人認為可以這樣排:數據結構與演算法,Java,Android(如果不找安卓的就去掉這部分),計算機網路,操作系統,設計模式。下面我就按照這個順序給出一些准備建議。
Ø 數據結構與演算法
推薦書籍:大話數據結構,數據結構與演算法分析(java語言描述),劍指offer,進軍矽谷。
推薦在線刷題網站:Leetcode(LeetCode Online Judge),Lintcod(LintCode - 主頁),牛客網(在線編程_C++Java前端經典筆試面試題庫)
推薦方案:主要做三件事。
1, 先看一遍大話數據結構,熟悉一些基本概念,大話這本書只講了一些基本的數據結構,像是B樹,B+樹,紅黑樹需要自己看一些博客或是網站,推薦一個講解演算法的網站-七月演算法,另外海量數據處理也是一個經常考的專題,它結合了數據結構和操作系統的一些知識,這個需要進行針對性准備。
2,然後開始刷題,最推薦的肯定是leetcode,刷題建議按照標簽進行刷題(比如隊列,棧,哈希表),刷題從易到難,最好能夠刷一百題左右,如果一天一題,至少要三個月以上,所以這個耗時比較長,要從比較早開始准備。進軍矽谷這本書有按照專題進行編排,基本上的題目來自leetcode,可以作為一個參考。
2, 然後要分析一些常見數據結構的源碼實現(比如隊列,棧,hashmap之類的),數據結構與演算法分析這本書有講一些,可以結合一些博客進行准備。
Ø Java
找程序員工作,大多數情況下需要掌握好一門面向對象的語言,主流上分為Java和C++兩大陣營。這里講Java需要怎麼准備。
入門書籍:Java核心技術卷一,Head first in java(如果一點面向對象的概念都沒有那就看這本)
提高書籍:Java編程思想
Java虛擬機:深入理解Java虛擬機
Java多線程:Java多線程編程核心技術,Java並發編程實踐
其實我覺得如果有一定基礎建議直接看Java編程思想,面試中的考點經常都會在這本書中有講到。當然Java虛擬機和多線程這兩塊需要再看一些專門講解的書,每一次java面試考查內容幾乎都離不開這兩塊。
總體來說java考察內容包括以下這些:
1,面向對象的一些基本概念:繼承,多態之類的
2, 抽象類和介面
3, 靜態類,內部類
4, Java集合類,同步和非同步
5, Java類載入機制
6, Java內存模型和垃圾回收演算法
7, 線程同步機制(volatile,synchronized,重入鎖,threadlocal),線程間通信(wait,notify)
8, 異常處理
9, 多線程同步問題,生產者消費者,讀者寫者,哲學家就餐,用java實現
10,
了解java中設計模式的思想,用了哪些設計模式,有什麼好處
Ø Android
入門書籍:第一行代碼。
提高書籍:Android群英傳,Android開發藝術探索。
上面的書看好了,一般問題不大。主要問的一些問題:
1, Activity,Service,BrocastReceiver,Intent,Fragemnet,ContentProvider,這些組件的基礎知識,比如Activity兩種啟動方式,生命周期,四種啟動模式,Service則主要是:兩種啟動方式,生命周期。還有組件之間怎麼通信之類的問題。
2, Android的數據存儲方式,資料庫,sd卡,SharedPreferences 這些
3, Listview的優化,與scollview的區別
4, view狀態與重繪,view的繪制過程,view的事件分發機制,view的事件沖突處理
5, Android多線程非同步機制,AsyncTask工作原理與源碼實現,Handler,Message,Looper非同步實現機制與源碼分析
6, Android常見的開源框架(主要是網路通信,圖片載入這些),了解怎麼使用,分析源碼
7, Oom和anr異常引發的原因,怎麼解決
8, 了解一些常見的圖片緩存技術
Ø 計算機網路
推薦書籍:計算機網路自頂向下,tcp/ip協議詳解卷一
主要看:主要看應用層,傳輸層,網路層,其中傳輸層最為重要。主要的一些考察內容有:
1, TCP和UDP的區別
2, TCP的三次握手,和四次揮手,為什麼需要三次握手,為什麼要四次揮手(這兩個為什麼要考慮非常清楚)
3, TCP擁塞控制演算法(慢啟動,擁塞避免,快速恢復),流量控制演算法,滑動窗口協議,選擇重傳。
4, TCP可靠性是怎麼保證的(通過哪些機制保證)?
5, HTTP協議報文格式,請求方法欄位以及各個方法之間的區別,了解常見的響應狀態碼,了解cookie機制,了解WEB緩存技術(條件get方法)。
6, DNS協議的各層域名伺服器,兩種查詢方式(遞歸和迭代),dns緩存
7, Udp的特點,適用場景,校驗機制
8, 從輸入一個網址到最後網頁顯示整個過程發生了什麼?
9, IP地址組成,ARR,RARP,ICMP協議,路由選擇演算法
H. android 面試題
1、前言
6 月 26 日, Google Android 發布了 NDK ,引起了很多發人員的興趣。 NDK 全
稱: Native Development Kit 。下載地址為:
http://developer.android.com/sdk/ndk/1.5_r1/index.html 。
2、誤解
新出生的事物,除了驚喜外,也會給我們帶來一定的迷惑、誤解。
2.1、誤解一: NDK 發布之前, Android 不支持進行 C 開發
在 Google 中搜索 「NDK」 ,很多 「Android 終於可以使用 C++ 開發 」 之類
的標題,這是一種對 Android 平台編程方式的誤解。其實, Android 平台從誕生起,就已
經支持 C 、 C++ 開發。眾所周知, Android 的 SDK 基於 Java 實現, 這意味著基於 Android
SDK 進行開發的第三方應用都必須使用 Java 語言。但這並不等同於 「 第三方應用只能使
用 Java」 。在 Android SDK 首次發布時, Google 就宣稱其虛擬機 Dalvik 支持 JNI 編程
方式,也就是第三方應用完全可以通過 JNI 調用自己的 C 動態庫,即在 Android 平台上,
「Java+C」 的編程方式是一直都可以實現的。
當然這種誤解的產生是有根源的:在 Android SDK 文檔里,找不到任何 JNI 方面的
幫助。即使第三方應用開發者使用 JNI 完成了自己的 C 動態鏈接庫( so )開發,但是 so
如何和應用程序一起打包成 apk 並發布?這裡面也存在技術障礙。我曾經花了不少時間,
安裝交叉編譯器創建 so ,並通過 asset (資源)方式,實現捆綁 so 發布。但這種方式只
能屬於取巧的方式,並非官方支持。所以,在 NDK 出來之前,我們將 「Java+C」 的開發
模式稱之為灰色模式,即官方既不聲明 「 支持這種方式 」 ,也不聲明 「 不支持這種方
式 」 。
2.2、誤解二:有了 NDK ,我們可以使用純 C 開發 Android 應用
Android SDK 採用 Java 語言發布,把眾多的 C 開發人員排除在第三方應用開發外
( 注意:我們所有討論都是基於「 第三方應用開發 」 , Android 系統基於 Linux ,系
統級別的開發肯定是支持 C 語言的。 )。 NDK 的發布,許多人會誤以為,類似於 Symbian 、
WM ,在 Android 平台上終於可以使用純 C 、 C++ 開發第三方應用了!其實不然, NDK
文檔明確說明: it is not a good way 。因為 NDK 並沒有提供各種系統事件處理支持,也沒
有提供應用程序生命周期維護。此外,在本次發布的 NDK 中,應用程序 UI 方面的 API 也
沒有提供。至少目前來說,使用純 C 、 C++ 開發一個完整應用的條件還不完備。
3、NDK 是什麼
對 NDK 進行了粗略的研究後,我對 「NDK 是什麼 」 的理解如下:
1、NDK 是一系列工具的集合。
NDK 提供了一系列的工具,幫助開發者快速開發 C (或 C++ )的動態庫,並能自動
將 so 和 java 應用一起打包成 apk 。這些工具對開發者的幫助是巨大的。
NDK 集成了交叉編譯器,並提供了相應的 mk 文件隔離 CPU 、平台、 ABI 等差異,
開發人員只需要簡單修改 mk 文件(指出 「 哪些文件需要編譯 」 、 「 編譯特性要求 」
等),就可以創建出 so 。
NDK 可以自動地將 so 和 Java 應用一起打包,極大地減輕了開發人員的打包工作。
2、NDK 提供了一份穩定、功能有限的 API 頭文件聲明。
oogle 明確聲明該 API 是穩定的,在後續所有版本中都穩定支持當前發布的 API 。
從該版本的 NDK 中看出,這些 API 支持的功能非常有限,包含有: C 標准庫( libc )、
標准數學庫( libm )、壓縮庫( libz )、 Log 庫( liblog )。
G
4、NDK 帶來什麼
1、NDK 的發布,使 「Java+C」 的開發方式終於轉正,成為官方支持的開發方式。
使用 NDK ,我們可以將要求高性能的應用邏輯使用 C 開發,從而提高應用程序的執
行效率。
使用 NDK ,我們可以將需要保密的應用邏輯使用 C 開發。畢竟, Java 包都是可以反
編譯的。
NDK 促使專業 so 組件商的出現。(樂觀猜想,要視乎 Android 用戶的數量)
2、NDK 將是 Android 平台支持 C 開發的開端。
NDK 提供了的開發工具集合,使開發人員可以便捷地開發、發布 C 組件。同時,
Google 承諾在 NDK 後續版本中提高 「 可調式 」 能力,即提供遠程的 gdb 工具,使我
們可以便捷地調試 C 源碼。在支持 Android 平台 C 開發,我們能感覺到 Google 花費了
很大精力,我們有理由憧憬 「C 組件支持 」 只是 Google Android 平台上 C 開發的開端。
畢竟, C 程序員仍然是碼農陣營中的絕對主力,將這部分人排除在 Android 應用開發之外,
顯然是不利於 Android 平台繁榮昌盛的。
I. android面試題會出現什麼內容
1.android dvm 的進程和Linux的進程,應用程序的進程是否為同一個概念:
答:dvm是dalivk虛擬機。每一個android應用程序都在自己的進程中運行,都擁有一個dalivk虛擬機實例。而每一個dvm都是在linux的一個進程。所以說可以認為是同一個概念。
2.android的動畫有哪幾種?他們的特點和區別是什麼?
答:兩種,一種是tween動畫,一種是frame動畫。tween動畫,這種實現方式可以使視圖組件移動,放大或縮小以及產生透明度的變化。frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
3.handler進制的原理:
答:android提供了handler和looper來滿足線程間的通信。Handler先進先出原則。looper用來管理特定線程內對象之間的消息交換(message Exchange).
1)looper:一個線程可以產生一個looper對象,由它來管理此線程里的message queue(消息隊列)
2)handler:你可以構造一個handler對象來與looper溝通,以便push新消息到messagequeue里;或者接收looper(從messagequeue里取出)所送來的消息。
3)messagequeue:用來存放線程放入的消息。
4)線程:UI thread 通常就是main thread,而android啟動程序時會為它建立一個message queue.
4.android view的刷新:
答:Android中對View的更新有很多種方式,使用時要區分不同的應用場合。我感覺最要緊的是分清:多線程和雙緩沖的使用情況。
1).不使用多線程和雙緩沖
這種情況最簡單了,一般只是希望在View發生改變時對UI進行重繪。你只需在Activity中顯式地調用View對象中的invalidate()方法即可。系統會自動調用 View的onDraw()方法。
2).使用多線程和不使用雙緩沖
這種情況需要開啟新的線程,新開的線程就不好訪問View對象了。強行訪問的話會報:android.view.ViewRoot$:Only the originalthread that created a view hierarchy can touch its views.
這時候你需要創建一個繼承了android.os.Handler的子類,並重寫handleMessage(Messagemsg)方法。android.os.Handler是能發送和處理消息的,你需要在Activity中發出更新UI的消息,然後再你的Handler(可以使用匿名內部類)中處理消息(因為匿名內部類可以訪問父類變數,你可以直接調用View對象中的invalidate()方法 )。也就是說:在新線程創建並發送一個Message,然後再主線程中捕獲、處理該消息。
3).使用多線程和雙緩沖
Android中SurfaceView是View的子類,她同時也實現了雙緩沖。你可以定義一個她的子類並實現SurfaceHolder.Callback介面。由於實現SurfaceHolder.Callback介面,新線程就不需要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法可以鎖定畫布,繪制玩新的圖像後調用unlockCanvasAndPost(canvas)解鎖(顯示),還是比較方便得。
5.說說mvc模式的原理,它在android中的運用:
答:android的官方建議應用程序的開發採用mvc模式。何謂mvc?
mvc是model,view,controller的縮寫,mvc包含三個部分:
l模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。
2視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。
3控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,想用用戶出發的相關事件,交給m哦得了處理。
android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:
1)視圖層(view):一般採用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如何你對android了解的比較的多了話,就一定 可以想到在android中也可以使用javascript+html等的方式作為view層,當然這里需要進行java和javascript之間的通 信,幸運的是,android提供了它們之間非常方便的通信實現。
2)控制層(controller):android的控制層的重 任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業務邏輯層處理, 這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這里,程序就很容易被回收掉。
3)模型層(model):對資料庫的操作、對網路等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。
6.Activity的生命周期:
答:onCreate: 在這里創建界面,做一些數據 的初始化工作
onStart: 到這一步變成用戶可見不可交互的
onResume:變成和用戶可交互 的,(在activity 棧系統通過棧的方式管理這些個Activity的最上面,運行完彈出棧,則回到上一個Activity)
onPause: 到這一步是可見但不可交互的,系統會停止動畫 等消耗CPU 的事情從上文的描述已經知道,應該在這里保存你的一些數據,因為這個時候你的程序的優先順序降低,有可能被系統收回。在這里保存的數據,應該在
onstop: 變得不可見,被下一個activity覆蓋了
onDestroy: 這是activity被幹掉前最後一個被調用方法了,可能是外面類調用finish方法或者是系統為了節省空間將它暫時性的幹掉
7.讓Activity變成一個窗口:
答:Activity屬性設定:有時候會做個應用程序是漂浮在手機主界面的。這個只需要在設置下Activity的主題theme,即在Manifest.xml定義Activity的地方加一句:
android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:
android:theme="@android:style/Theme.Translucent"
8.Android中常用的五種布局:
答:LinearLayout線性布局;AbsoluteLayout絕對布局;TableLayout表格布局;RelativeLayout相對布局;FrameLayout幀布局;
9.Android的五種數據存儲方式:
答:sharedPreferences;文件;SQLite;contentProvider;網路
附上出處鏈接:http://www.51e.com/it/bckf/36635.html
J. Android面試題一道
面介紹一下RelativeLayout用到的一些重要的屬性: 第一類:屬性值為true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相對於父元素完全居中 android:layout_alignPar..