如何在执行之前获取AsyncTask的线程名称?



我在做AOP工具,我想记录线程生成关系,比如谁启动一个新的异步任务,所以我想在父线程调用android.os.AsyncTask.execute之前获得AsyncTask的线程名称。在AOP的before建议中,我可以获得AsyncTask对象,但是看起来asnctask类没有提供一个公共方法来获取线程名称和线程id。在执行异步任务之前,有什么方法可以获取异步任务的线程名和线程id吗?

与线程的start方法不同,在启动线程之前,我可以通过使用线程对象调用thread.getName()和thread.getId()来获取线程的名称和id。

====================更新=============
我找到了一个解决方法,在调用android.os.AsyncTask.execute之前,将AsyncTask obj ref及其当前线程名称(AsyncTask的父线程)保存为映射的键值。然后在asyncTask的doInBackground()过程中,调用Thread.currentThread().getName()获取当前asyncTask的线程名称,并使用this-asyncTask-obj-ref作为键查询上面的映射,就可以获取父线程的线程名称。所以我们可以得到代际关系。

这是来自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#"开头,然后是您启动它的次数;

我不熟悉API,但您可以使用around建议,保存当前线程proceed(..),然后可以在返回的线程上调用getName()

最新更新