bolts-android

4401 ワード

Androidクライアントのプログラミングには、uiスレッドで時間のかかる操作ができないという明確なルールがあります.これにより、ネットワークリクエスト、ファイルの読み書きなどの操作は非同期であることが要求される.非同期操作が完了すると、uiインタフェースを再更新する必要があることが多い.最も直接的な考えはコールバックであり,uiスレッド内でuiコンポーネントを更新することが難しくないことを保証する限りである.しかし、場合によっては、多層非同期操作が必要になることが多く、メンテナンスにしても作成にしても課題になります.公開内容の例として、まずすべての画像をアップロードし、画像を順次アップロードします.画像のアップロードが完了したら、インタフェースを呼び出してコンテンツを公開します.これはよくあるシーンで、私たちはまずコールバックで実現して、感じています.まず,画像アップロードのインタフェースを定義し,非同期操作であるためコールバックを追加する.
private void uploadImage(Image image, ImageUploadCallback callback) {...}
第2ステップでは、複数のピクチャがアップロードされるインタフェースを定義し、ピクチャを順次アップロードする場合、再帰大法を用いる必要がある.△私は再帰が好きではありません.再帰は考えなければならないので、書くにしても維持するにしても、はっきり考えることができます.
private void uploadImages(List images, UploadAllImageCallback callback) {
        Image poped = images.remove(0);
        uploadImageRecursive(images, poped, callback);
    }
    private void uploadImageRecursive(final List left, Image image, final UploadAllImageCallback callback) {
        uploadImage(image, new ImageUploadCallback() {
            public void onFinished(Exception e, String url) {
                if (e != null) {
                    if (callback != null) callback.onFinished(e/*failed*/);
                    return;
                }
                if (left.isEmpty()) {
                    if (callback != null) callback.onFinished(null/*sucess*/);
                    return;
                }
                Image poped = left.remove(0);
                uploadImageRecursive(left, poped, callback);
            }
        })
    }
ステップ3では、パブリッシュコンテンツインタフェースを定義します.
private void httpPublishPost(Post post, HttpPublishPostCallback callback) { ...}
第4歩は、公開画像と公開内容を統合する.
public void publishPost(Post post, PublishPostCallback callback) {
        uploadImages(post.images, new UploadAllImageCallback() {
            public void onFinished(Exception e) {
                if (e != null) {
                    if (callback != null) callback.onFinished(e);
                    return;
                }
                httpPublishPost(post, new HttpPublishPostCallback() {
                    public void onFinished(Exception e) {
                        if (callback != null) {
                            callback.onFinished(e);
                        }
                    }
                })
            }
        })
    }

一連のコードは、少なくとも以下のいくつかの点でコードのメンテナンスに不利です.
画像のリリースは再帰的に使用され、コードがはっきりしていないため、作成とメンテナンスが不便で、最後の統合が大変で、多層コールバックに使用されました.JAvaはjsよりも、コールバック伝達を定義するのが苦痛です.
Boltsはタスクのパッケージを提供し、すべての操作をTaskと抽象化し、2つの結果のみを含み、エラー&成功した.開発者が使いやすい一連のインタフェースを提供しています.私たちは依然として発表内容を例に、Boltsの使用方法とメリットを説明します.まず、単一のピクチャアップロードインタフェースを定義します.
private Task uploadImage(Image image) {
        return Task.callInBackground(new Callable() {
            public Void call() {...
                throw new Exception(); //for error//orreturn null;//for success.}});
                }
ここで画像がアップロードされ、コールバックではなくTaskオブジェクトが返されます.Taskは、実行が完了したイベントをリスニングし、実行結果を取得するために使用することができる.
第2のステップでは、複数のピクチャがアップロードされるインタフェースを定義します.牛が追い詰められたところが来ましたね.
private Task uploadImages(List images) {
        Task task = Task.forResult(null);
        for (Image image : images) {
            task = task.onSuccessTask(new Continuation>() {
                public Task then(Task task) throws Exception {
                    return uploadImage(image);
                }
            });
        }
        return task;
    }
メリット:
再帰なし再帰なし再帰なし.エラーコードは直接下に渡され、エラー後に自動的に中断されます.
ステップ3では、パブリッシュコンテンツのインタフェースを定義します.
private Task httpPublishPost(Post post) { ...}
ステップ4では、公開画像と公開コンテンツインタフェースを統合します.
public Task publishPost(Post post) {
        return uploadImages(post.images).onSuccessTask(new Continuation>() {
            public Task then(Task task) throws Exception {
                return httpPublishPost(post);
            }
        });
    }
Boltsは最近使用され始めたばかりで、非同期処理に大きな助けになりました.
前にRxJavaを見たことがあって、1種の扁平化のプログラミング方式で、非同期の処理に対してもとても便利で、しかし包みはとても大きくて、全体のプログラミングの思想ももとのモードととても大きい違いがあって、前に1つの小さいプロジェクトの上で役に立つことができて、それから振り回して振り回して、ずっと順調ではありません.
Boltsは軽くて、役に立つクラスもTask一つで、コードも多くなくて、とても好きです