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

3
我正在进行AOP注入,我希望记录线程的生成关系,例如谁启动了新的异步任务,因此我想在父线程调用android.os.AsyncTask.execute之前获取AsyncTask的线程名称。在AOP的before advice中,我可以获取AsyncTask对象,但似乎asnctask类没有提供公共方法来获取线程名称和线程ID。是否有方法可以在执行之前获取asynctask的线程名称和线程ID呢?
与线程的start方法不同,在开始一个线程之前,我可以使用线程对象调用Thread.getName()和Thread.getId()来获取线程的名称和ID。

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

2个回答

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


从我的应用程序日志来看,似乎数字并不总是增加的,有些在异步任务终止后被重复使用。 - bettermanlu

0

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


AsyncTask的execute函数不会返回线程处理程序。 - bettermanlu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接