2014-01-15 40 views
3

我正在做AOP工具,我想記錄線程生成關係,比如誰啓動了一個新的異步任務,所以我想在父線程調用android.os.AsyncTask.execute之前獲取AsyncTask的線程名稱。在AOP的建議之前,我可以獲取AsyncTask對象,但看起來像asnctask類不提供公共方法來獲取線程名稱和線程ID。有沒有辦法在執行之前獲得asynctask的線程名稱和線程ID 如何在執行之前獲取AsyncTask的線程名稱?

與線程的啓動方法不同,在啓動線程之前,我可以通過調用線程對象的Thread.getName()和Thread.getId()來獲得線程的名稱和ID。

============ UPDATE ==============
我已經找到一個解決辦法,呼籲android.os.AsyncTask.execute前,將asyncTask obj ref及其當前線程名稱(asynctask的父線程)保存爲映射的鍵值。然後在asyncTask的doInBackground()過程中,調用Thread.currentThread()。getName()來獲取當前asynctask的線程名稱,並使用這個asynctask obj ref作爲鍵來查詢上面的映射,然後我們可以得到父代的線程名線。所以我們可以得到世代關係。

回答

1

這是從的AsyncTask類代碼:

private static final ThreadFactory sThreadFactory = new ThreadFactory() { 
    private final AtomicInteger mCount = new AtomicInteger(1); 

    public Thread newThread(Runnable r) { 
     return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); 
    } 
}; 

,你可以看到線程名始終以「#的AsyncTask」,然後你開始了它次數開始;

+0

從我的應用程序日誌看來,數字並不總是增加,有些在asynctask終止後重用。 – bettermanlu

0

我不熟悉API,但可以使用around建議,保存當前線程proceed(..),然後你可以在返回的線程上調用getName()

+0

AsyncTask的執行函數不返回線程處理程序。 – bettermanlu

相關問題