我想自定义从AccountManager获取认证令牌的过程。
我希望按照以下方式实现:
在我的Activity中使用以下嵌套类:
AccountManager
有getAuthToken()
和getAuthTokenByFeatures()
方法,但我想实现一个自定义的流程,包括在活动之间切换等...我希望按照以下方式实现:
public AccountManagerFuture<Bundle> getAuthTokenForActiveAccount() {
GetAuthTokenForActiveAccountFuture future =
new GetAuthTokenForActiveAccountFuture(MyActivity.this);
future.start();
return future;
}
在我的Activity中使用以下嵌套类:
private static class GetAuthTokenForActiveAccountFuture extends Thread implements
AccountManagerFuture<Bundle> {
private final Activity mActivity;
public GetAuthTokenForActiveAccountFuture(Activity activity) {
mActivity = activity;
// TODO: write this method
}
@Override
public void run() {
// TODO: write this method
}
@Override
public boolean cancel(boolean b) {
// TODO: write this method
return false;
}
@Override
public boolean isCancelled() {
// TODO: write this method
return false;
}
@Override
public boolean isDone() {
// TODO: write this method
return false;
}
@Override
public Bundle getResult() throws
OperationCanceledException, IOException, AuthenticatorException {
return internalGetResult(null, null);
}
@Override
public Bundle getResult(long timeout, TimeUnit timeUnit) throws
OperationCanceledException, IOException, AuthenticatorException {
return internalGetResult(timeout, timeUnit);
}
private Bundle internalGetResult(Long timeout, TimeUnit timeUnit) throws
OperationCanceledException, IOException, AuthenticatorException {
// TODO: write this method
return null;
}
}
我的想法是我可以创建自己的AccountManagerFuture对象,并在完成所有必要步骤(其中一些包括活动切换)后才“解除阻止”其getResult()
方法。
这里有两个问题:
- 我需要
Activity
上下文来在需要时切换到其他活动,但是我传递给构造函数的Activity
应该在我切换到其他活动时被销毁,但由于我的Thread
持有对它的引用...所以我在这里创建了内存泄漏。看起来使内部类非静态并不能解决此问题-从getAuthTokenForActiveAccount()
返回的引用仍将阻止外部Activity
被垃圾回收。有没有任何方式可以在不泄漏上下文的情况下实现我想做的事情? Thread
在其run()
方法返回后就可以进行垃圾回收,对吧?但是在我的情况下,我希望这个线程保持存在,因为它也充当AccountManagerFuture
,直到所有对它的引用都消失之前,它应该被保留在内存中。我的问题是:仅通过保持对Thread
的(强)引用是否足以防止它被垃圾回收?如果不行,我该如何让这个Thread
一直保持到所有引用消失为止?
addAccount()
,getAuthToken()
,newChooseAccountIntent()
等)- 这些API的一部分引用了我已经实现的“AccountAuthenticator”,而其中一些则负责切换活动,因此它们需要适当的上下文...是的,我可以重新发明轮子,但在这样做之前,我想确保这真的是我的唯一选择。 - VasiliygetAuthTokenByFeatures()
,但我将来一定会再次研究这个问题,并且希望记得在这里发布我的发现。 - Vasiliy