在为返回值的函数实现多线程时遇到的困难问题

时间:2012-11-30 03:20:23

标签: java android design-patterns

将TokenCache类传递给Facebook类以执行save()load()令牌。 TokenCache具有以下功能:

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

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

3 个答案:

答案 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。