Androidウェルカムページトップページデータのプリロード

3386 ワード

プロジェクト要件:tokenログインとトップページのプリロードを同時に実行するウェルカムページを表示
背景:
これに先立ち,展示ウェルカムページやtokenログインなどのネットワーク操作はシリアルであるため,ユーザがAppをクリックして最終的にトップページを見るまでの時間は,「ウェルカムページを表示する時間」+「ログイン時間」+「トップページデータを要求する時間」である.単一スレッドでこれらのことを処理する利点は、論理が明確で、制御が簡単であることです.欠点も際立っています:ユーザーの体験がよくなくて、特にネットの状況が悪い時、待ち時間が大幅に増加します.
このバージョンにはスキップ機能が追加され、待ち時間に対する要求が高くなり、私は「刀を研いでホーホーホー」とこの問題の解決に着手しなければなりません.
シーン:
  • ウェルカムページで実行可能なネットワーク操作:バージョン更新、tokenログイン、トップページデータのプリロード(2つのインタフェース)を確認します.
  • ローカルにユーザのログイン情報が保存されている場合、tokenログインを実行する.
  • ローカルにユーザーのログイン情報が保存されていない場合は、ログインページにジャンプします.
  • ネットワーク接続エラー(ネットワーク切断、タイムアウトなど)が発生した場合、直接ユーザーに「ネットワークエラー」を提示し、ソフトウェアを終了する.
  • 強制更新が必要な場合は、ログインページにジャンプして更新します.
  • tokenログインに失敗し、ログインページにジャンプしました.
  • すべてのインタフェース要求が完了し(tokenログインに成功したのみ)、データを携帯してトップページを起動します.

  • 考え方:
  • は、ウェルカムページを表示しながら、すべてのネットワーク要求を開始する.
  • AtomicIntegerカウントを使用し、AtomicBooleanを使用してキーイベントをマークします(表示時間に達したかどうか、ネットワークエラーが発生したかどうか、ログインページにジャンプする必要があるかどうか).
  • 各ネットワーク操作が完了した場合、カウンタをタイムリーに更新し、「関心」イベントが発生した場合は登録する.
  • 各ネットワーク操作が完了すると、ゴールテストを行います(自分が最後の完了者かどうかを判断し、そうであればジャンプを実行します).

  • キーコード:
    ネットワークリクエストの例:
    VersionModelImpl.CheckVersionListener listener = new VersionModelImpl.CheckVersionListener() {
                @Override
                public void onSuccess(JSONObject data) {
                    try {
                        final Version version = new Gson().fromJson(data.toString(), Version.class);
                        if (isMustUpdate(version)) {
                            mNeedLogin.set(true);//    
                        }
                        isCheckVersionSuccess = true;//          
                        mStepsAtomicInteger.getAndIncrement();//   
                        finalTest();//    
                    } catch (Exception e) {
                        e.printStackTrace();
                        mNeedLogin.set(true);
                        mStepsAtomicInteger.getAndIncrement();
                        finalTest();
                    }
                }
    
                @Override
                public void onFailure(String code, String message) {
                    mIsNetworkError.set(true);//       
                    mStepsAtomicInteger.getAndIncrement();
                    finalTest();
                }
            };
    

    終了テスト方法:
    //    ,          
        private synchronized void finalTest() {
            if (!mAllowFinalTestAtomicBoolean.get()) {//      
                return;
            }
            if(mIsNetworkError.get()){//      
                try {
                    final Dialog dialog = confirm("       ~       ~");
                    dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                        @Override
                        public void onDismiss(DialogInterface dialog) {
                            onBackPressed();
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return;
            }
            if (mNeedLogin.get()) {//      
                LoginActivity.enterLogin(PictureActivity.this);
                return;
            }
            if (mStepsAtomicInteger.intValue() >= 4) {//          
                if (isCheckVersionSuccess && isLoginByTokenSuccess) {
                    enterMainActivity();
                } else {
                    LoginActivity.enterLogin(PictureActivity.this);
                }
            }
        }