程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 應用httpclient完成收費的谷歌翻譯api

應用httpclient完成收費的谷歌翻譯api

編輯:關於JAVA

應用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一樣。

綜上所述,這個辦法是靠得住的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved