應用httpclient完成收費的谷歌翻譯api。本站提示廣大學習愛好者:(應用httpclient完成收費的谷歌翻譯api)文章只能為提供參考,不一定能成為您想要的結果。以下是應用httpclient完成收費的谷歌翻譯api正文
假如在Android中斷定某個線程能否是主線程?關於這個成績,你能夠說依據線程的名字,固然這個可以處理成績,然則如許是最靠得住的麼?萬一某天Google一會兒將線程的名字改稱其他神馬器械呢。
辦法揭曉
上面的辦法是最靠得住的處理計劃。
public static boolean isInMainThread() {
return Looper.myLooper() == Looper.getMainLooper();
}
現實上,寫到這裡就根本處理了文章題目的成績了,然則僅僅研討到這裡太浮淺了,刨的不敷深,所以須要持續,願望你也能夠持續讀下去。
尋根究底
試驗一
好,如今,我們對這個穩固的辦法做一些測試,起首,上面的辦法會增長一些調試打印信息。
private boolean isInMainThread() {
Looper myLooper = Looper.myLooper();
Looper mainLooper = Looper.getMainLooper();
Log.i(LOGTAG, "isInMainThread myLooper=" + myLooper
+ ";mainLooper=" + mainLooper);
return myLooper == mainLooper;
}
好,然後我們在主線程中運轉一個測試,挪用上述辦法。好比我們如許挪用。
Log.i(LOGTAG, "testInMainThread inMainThread=" + isInMainThread());
OK,我們看一下輸入日記。驗證OK。
I/TestInMainThread(32028): isInMainThread myLooper=Looper{40d35ef8};mainLooper=Looper{40d35ef8}
I/TestInMainThread(32028): testInMainThread inMainThread=true
試驗二
如今我們持續在一個沒有新聞輪回的非主線程,停止驗證。
new Thread() {
@Override
public void run() {
Log.i(LOGTAG, "testIn NOT in MainThread isMainThread="
+ isInMainThread());
super.run();
}
}.start();
正如我們看到的以下日記成果,主線程的Looper(翻譯成輪回泵,不是很難聽)曾經被初始化賦值。然則我們新創立的線程的looper照樣null。這是由於Android中的線程默許沒有一個和它綁定了的新聞輪回(Threads by default do not have a message loop associated with them. Of course, the method works)
I/TestInMainThread(32028): isInMainThread myLooper=null;mainLooper=Looper{40d35ef8}
I/TestInMainThread(32028): testIn NOT in MainThread isMainThread=false
試驗三
持續,我們創立一個綁定了新聞輪回的線程,依據Android開辟者文檔解釋,以下是一個典范的創立新聞輪回線程的示例,應用零丁prepare()辦法和loop()辦法來創立一個綁定到Looper的Handler。
new Thread() {
private Handler mHandler;
@Override
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Log.i(LOGTAG, "testInNonMainLooperThread isMainThread="
+ isInMainThread());
Looper.loop();
}
}.start();
OK,如今再次檢討以下日記,
I/TestInMainThread(32028): isInMainThread myLooper=Looper{40d72c58};mainLooper=Looper{40d35ef8}
I/TestInMainThread(32028): testInNonMainLooperThread isMainThread=false
兩個Looper都被初始化賦值了,然則他們是分歧的對象。
道理挖掘
然則,這是為何呢,這外面有甚麼奧妙呢? 好,讓我們看以下Looper.class
// sThreadLocal.get() will return null unless you've called prepare().
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
private static Looper sMainLooper; // guarded by Looper.class
/**
* Initialize the current thread as a looper, marking it as an
* application's main looper. The main looper for your application
* is created by the Android environment, so you should never need
* to call this function yourself. See also: {@link #prepare()}
*/
public static void prepareMainLooper() {
prepare(false);
synchronized (Looper.class) {
if (sMainLooper != null) {
throw new IllegalStateException("The main Looper has already been prepared.");
}
sMainLooper = myLooper();
}
}
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
/**
* Return the Looper object associated with the current thread.
* Returns null if the calling thread is not associated with a Looper.
*/
public static Looper myLooper() {
return sThreadLocal.get();
}
/** Returns the application's main looper, which lives in the main thread of the application.
*/
public static Looper getMainLooper() {
synchronized (Looper.class) {
return sMainLooper;
}
}
關於主線程來講,prepareMainLooper這個辦法會被Android運轉情況挪用,而不是法式顯式挪用。經由過程這個辦法,主線程的looper被創立,而且將對象援用傳遞給sMainLooper。所以包管了主線程myLooper()獲得到的援用和getMainLooper()獲得到的都是統一個援用。
關於沒有新聞輪回的非主線程,默許確當前哨程的looper是null,由於你歷來沒有手動地挪用prepare(),所以它和主線程的looper紛歧樣。
關於綁定了新聞輪回的非主線程,當挪用Looper.prepare辦法時,主線程的Looper曾經由Android運轉情況創立,當挪用prepare辦法後,綁定到這個非主線程的looper被創立,固然,這弗成能和主線程的Looper一樣。
綜上所述,這個辦法是靠得住的。