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