2

TokenCache 类被传递给 Facebook 类来做save()load()令牌。TokenCache具有以下功能:

public abstract void save(Bundle bundle);
public abstract Bundle load();

现在我想在多个线程中进行保存和加载,所以我AsyncTaskload(). 问题是它已经被设计为返回一个 Bundle!如何实现它以使值仅在AsyncTask完成时返回?

4

3 回答 3

1

您可能会使用回调机制。在AsyncTask中,load()完成后,调用回调方法根据返回的bundle进行操作。

于 2012-11-30T03:25:53.900 回答
1

只需在您的 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
        }
    }
于 2012-11-30T03:33:42.463 回答
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;
    }
}

顺便说一句:我真的不明白你为什么要在这里使用 AsyncTask 。

于 2012-11-30T03:48:43.453 回答