将TokenCache类传递给Facebook类以执行save()
和load()
令牌。 TokenCache
具有以下功能:
public abstract void save(Bundle bundle);
public abstract Bundle load();
现在我想在多个线程中保存和加载,所以我在AsyncTask
中运行load()
。问题是它已经被设计为返回一个Bundle!如何实现它以便仅在AsyncTask
完成时返回值?
答案 0 :(得分:1)
您可以使用回调机制。在AsyncTask中,在load()完成后,调用一个回调方法来根据返回的bundle进行操作。
答案 1 :(得分:1)
在您的TokenCache实现中只需要一个load()方法返回的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
}
}
答案 2 :(得分:0)
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;
}
}
btw:我实际上并不明白你为什么要在这里使用AsyncTask。