package licola.demo.com.huabandemo.Module.Welcome; import android.animation.Animator; import android.animation.AnimatorInflater; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.ImageView; import butterknife.BindString; import butterknife.BindView; import licola.demo.com.huabandemo.API.HttpsAPI.TokenAPI; import licola.demo.com.huabandemo.Base.BaseActivity; import licola.demo.com.huabandemo.HttpUtils.RetrofitClient; import licola.demo.com.huabandemo.Module.Login.LoginActivity; import licola.demo.com.huabandemo.Module.Login.TokenBean; import licola.demo.com.huabandemo.Module.Main.MainActivity; import licola.demo.com.huabandemo.Observable.MyRxObservable; import licola.demo.com.huabandemo.R; import licola.demo.com.huabandemo.Util.Base64; import licola.demo.com.huabandemo.Util.Constant; import licola.demo.com.huabandemo.Util.Logger; import licola.demo.com.huabandemo.Util.SPBuild; import licola.demo.com.huabandemo.Util.SPUtils; import licola.demo.com.huabandemo.Util.TimeUtils; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * Created by LiYi on 2016/04/11 14:26 * 欢迎页 进行登录判断 和联网重获token */ public class WelcomeActivity extends BaseActivity { //登录的报文需要 private static final String PASSWORD = "password"; private static final int mTimeDifference = TimeUtils.HOUR; // private static final int mTimeDifference = 0; @BindString(R.string.text_auto_login_fail) String mMessageFail; @BindView(R.id.img_welcome) ImageView mImageView; @Override protected int getLayoutId() { return R.layout.activity_welcome; } @Override protected String getTAG() { return this.toString(); } public static void launch(Activity activity) { Intent intent = new Intent(activity, WelcomeActivity.class); activity.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); isLogin = (Boolean) SPUtils.get(getApplicationContext(), Constant.ISLOGIN, isLogin); } @Override protected void onResume() { super.onResume(); Animator animation = AnimatorInflater.loadAnimator(mContext, R.animator.welcome_animator); //observeOn() 指定的是它之后的操作所在的线程 //subscribeOn() 作用于Observable对象 //onCompleted() 和 onError() 二者是互斥的 调用一个就不会再调用另一个 animation.setTarget(mImageView); MyRxObservable.add(animation) .observeOn(Schedulers.io()) .subscribeOn(AndroidSchedulers.mainThread())//指定订阅的Observable对象的call方法运行在ui线程中 .filter(new Func1<Void, Boolean>() { @Override public Boolean call(Void aVoid) { Logger.d("isLogin=" + isLogin); return isLogin; // return true; // return false; } }) .filter(new Func1<Void, Boolean>() { @Override public Boolean call(Void aVoid) { Long lastTime = (Long) SPUtils.get(getApplicationContext(), Constant.LOGINTIME, 0L); long dTime = System.currentTimeMillis() - lastTime; Logger.d("dTime=" + dTime + " default" + mTimeDifference); return dTime > mTimeDifference; } }) .flatMap(new Func1<Void, Observable<TokenBean>>() { @Override public Observable<TokenBean> call(Void aVoid) { Logger.d("flatMap"); String userAccount = (String) SPUtils.get(getApplicationContext(), Constant.USERACCOUNT, ""); String userPassword = (String) SPUtils.get(getApplicationContext(), Constant.USERPASSWORD, ""); return getUserToken(userAccount, userPassword); } }) // .retryWhen(new RetryWithConnectivityIncremental(WelcomeActivity.this, 4, 15, TimeUnit.SECONDS)) .observeOn(AndroidSchedulers.mainThread())//最后统一回到UI线程中处理 .subscribe(new Subscriber<TokenBean>() { @Override public void onCompleted() { Logger.d(); MainActivity.launch(WelcomeActivity.this); finish(); } @Override public void onError(Throwable e) { Logger.d(e.toString()); LoginActivity.launch(WelcomeActivity.this, mMessageFail); finish(); } @Override public void onNext(TokenBean tokenBean) { Logger.d("https success"); saveToken(tokenBean); } }); } private void saveToken(TokenBean tokenBean) { new SPBuild(getApplicationContext()) .addData(Constant.LOGINTIME, System.currentTimeMillis()) .addData(Constant.TOKENACCESS, tokenBean.getAccess_token()) .addData(Constant.TOKENTYPE, tokenBean.getToken_type()) .build(); } private Observable<TokenBean> getUserToken(String username, String password) { return RetrofitClient.createService(TokenAPI.class) .httpsGetTokenRx(Base64.mClientInto, PASSWORD, username, password); } }