2

TokenCache クラスは Facebook クラスに dosave()load()トークンを渡します。TokenCache次の機能があります。

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

ここで、複数のスレッドで保存と読み込みを行いたいので、 in を実行AsyncTaskload()ます。問題は、すでにバンドルを返すように設計されていることです! 終了時にのみ値が返されるように実装する方法はAsyncTask?

4

3 に答える 3

1

load() メソッドが返す TokenCache 実装に Bundle のフィールドを設定するだけです。Bundle が何らかの init(bundle) メソッドによって初期化されるまで、TokenCache への参照を FB にまだ渡さないようにしてください。

  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 に答える
1

コールバック メカニズムを使用できます。AsyncTask では、load() が終了した後、コールバック メソッドを呼び出して、返されたバンドルに基づいて操作を実行します。

于 2012-11-30T03:25:53.900 に答える
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 に答える