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

时间:2014-01-15 06:28:33

标签: java android multithreading android-asynctask aspectj

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

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

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

2 个答案:

答案 0 :(得分: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#”开头,​​然后是您启动​​它的次数;

答案 1 :(得分:0)

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