TokenCache 类被传递给 Facebook 类来做save()
和load()
令牌。TokenCache
具有以下功能:
public abstract void save(Bundle bundle);
public abstract Bundle load();
现在我想在多个线程中进行保存和加载,所以我AsyncTask
在load()
. 问题是它已经被设计为返回一个 Bundle!如何实现它以使值仅在AsyncTask
完成时返回?
TokenCache 类被传递给 Facebook 类来做save()
和load()
令牌。TokenCache
具有以下功能:
public abstract void save(Bundle bundle);
public abstract Bundle load();
现在我想在多个线程中进行保存和加载,所以我AsyncTask
在load()
. 问题是它已经被设计为返回一个 Bundle!如何实现它以使值仅在AsyncTask
完成时返回?
您可能会使用回调机制。在AsyncTask中,load()完成后,调用回调方法根据返回的bundle进行操作。
只需在您的 load() 方法返回的 TokenCache 实现中包含一个 Bundle 字段。只需确保您尚未将 TokenCache 的引用传递给 FB,直到该 Bundle 由某些 init(bundle) 方法初始化,例如
static class BundleRetrievalTask extends AsyncTask<String, Void, Bundle> {
@Override
protected Bundle doInBackground(String... strings) {
return someLongOperationThatFetchesBundle(strings[0]);
}
@Override
protected void onPostExecute(Bundle bundle) {
super.onPostExecute(bundle);
MyFacebookTokenCache tokenCache = MyFacebookTokenCache.init(bundle);
doSomethingWithCache(tokenCache);
}
}
static class MyFacebookTokenCache extends TokenCache {
private Bundle mBundle;
public MyFacebookTokenCache(Bundle bundle) {
mBundle = bundle;
}
public static MyFacebookTokenCache init(Bundle bundle) {
return new MyFacebookTokenCache(bundle);
}
@Override
public Bundle load() {
return mBundle;
}
@Override
public void save(Bundle bundle) {
//todo
}
@Override
public void clear() {
//todo
}
}
public static BundleAsyncTask extends AsyncTask<Void, Void, Void>{
public Bundle result;
private final CountDownLatch latch;
public BundleAsyncTask(CountDownLatch latch){
this.latch = latch;
}
public void doInBackground(){
//get the bundle
latch.countDown();
}
}
public Bundle load(){
final CountDownLatch latch = new CountDownLatch(1);
BundleAsyncTask task = new BundleAsyncTask(latch);
task.execute();
try{
latch.await();
return task.result;
}catch(InterruptedException e){
return null;
}
}
顺便说一句:我真的不明白你为什么要在这里使用 AsyncTask 。