Permalink
Browse files

Add the auto token refresh demo.

  • Loading branch information...
alighters committed Aug 21, 2016
1 parent bd9f3fb commit a7266bef2c0fee2b60f5ef2c3ecd06456d624eef
Showing with 878 additions and 5 deletions.
  1. +15 −2 app/build.gradle
  2. +4 −0 app/src/main/AndroidManifest.xml
  3. +6 −0 app/src/main/java/com/lighters/demos/MainActivity.java
  4. +9 −0 app/src/main/java/com/lighters/demos/app/base/BaseApplication.java
  5. +107 −0 app/src/main/java/com/lighters/demos/token/TokenTestActivity.java
  6. +34 −0 app/src/main/java/com/lighters/demos/token/http/GlobalToken.java
  7. +81 −0 app/src/main/java/com/lighters/demos/token/http/RetrofitUtil.java
  8. +32 −0 app/src/main/java/com/lighters/demos/token/http/api/ApiModel.java
  9. +27 −0 app/src/main/java/com/lighters/demos/token/http/api/ErrorCode.java
  10. +38 −0 app/src/main/java/com/lighters/demos/token/http/api/IApiService.java
  11. +31 −0 app/src/main/java/com/lighters/demos/token/http/api/ResultModel.java
  12. +27 −0 app/src/main/java/com/lighters/demos/token/http/api/TokenModel.java
  13. +91 −0 app/src/main/java/com/lighters/demos/token/http/converter/GsonConverterFactory.java
  14. +52 −0 app/src/main/java/com/lighters/demos/token/http/converter/GsonRequestBodyConverter.java
  15. +55 −0 app/src/main/java/com/lighters/demos/token/http/converter/GsonResponseBodyConverter.java
  16. +27 −0 app/src/main/java/com/lighters/demos/token/http/exception/TokenInvalidException.java
  17. +25 −0 app/src/main/java/com/lighters/demos/token/http/exception/TokenNotExistException.java
  18. +164 −0 app/src/main/java/com/lighters/demos/token/http/proxy/ProxyHandler.java
  19. +8 −0 app/src/main/res/layout/activity_main.xml
  20. +37 −0 app/src/main/res/layout/activity_token_test.xml
  21. +5 −0 app/src/main/res/values/strings.xml
  22. +1 −1 build.gradle
  23. +2 −2 gradle/wrapper/gradle-wrapper.properties
@@ -21,13 +21,26 @@ android {
sourceSets.main {
jniLibs.srcDirs = ['src/main/libs'] // <-- Set your folder here!
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
// view
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.jakewharton:butterknife:8.2.1'
apt 'com.jakewharton:butterknife-compiler:8.2.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.google.code.gson:gson:2.5'
compile 'io.reactivex:rxjava:1.1.9'
compile 'io.reactivex:rxandroid:1.2.1'
// test
testCompile 'junit:junit:4.12'
}
@@ -2,6 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lighters.demos">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
@@ -21,6 +23,8 @@
android:theme="@style/TranslucentTheme"/>
<activity android:name=".jni.JniTestActivity"/>
<activity android:name=".token.TokenTestActivity"/>
</application>
</manifest>
@@ -6,6 +6,7 @@
import com.lighters.demos.anim.FirstActivity;
import com.lighters.demos.app.base.BaseActivity;
import com.lighters.demos.jni.JniTestActivity;
import com.lighters.demos.token.TokenTestActivity;
public class MainActivity extends BaseActivity {
@@ -33,4 +34,9 @@ void gotoAnimScreen() {
void gotoJniTest() {
startActivity(new Intent(this, JniTestActivity.class));
}
@OnClick(R.id.btn_token_test)
void gotoTokenTest() {
startActivity(new Intent(this, TokenTestActivity.class));
}
}
@@ -17,6 +17,7 @@
package com.lighters.demos.app.base;
import android.app.Application;
import android.content.Context;
/**
* Created by david on 16/7/27.
@@ -25,8 +26,16 @@
*/
public class BaseApplication extends Application {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
}
@@ -0,0 +1,107 @@
/*
* Copyright (C) 2016 david.wei (lighters)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.lighters.demos.token;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import butterknife.OnClick;
import com.lighters.demos.R;
import com.lighters.demos.app.base.BaseActivity;
import com.lighters.demos.token.http.GlobalToken;
import com.lighters.demos.token.http.RetrofitUtil;
import com.lighters.demos.token.http.api.IApiService;
import com.lighters.demos.token.http.api.ResultModel;
import com.lighters.demos.token.http.api.TokenModel;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by david on 16/8/21.
* Email: huangdiv5@gmail.com
* GitHub: https://github.com/alighters
*/
public class TokenTestActivity extends BaseActivity {
@Override
protected int getLayoutId() {
return R.layout.activity_token_test;
}
@Override
protected void setView(Bundle savedInstanceState) {
}
@Override
protected void initData() {
}
@OnClick(R.id.btn_token_get)
public void onGetTokenClick(View v) {
RetrofitUtil.getInstance()
.get(IApiService.class)
.getToken()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<TokenModel>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(TokenModel model) {
if (model != null && !TextUtils.isEmpty(model.token)) {
GlobalToken.updateToken(model.token);
}
}
});
}
@OnClick(R.id.btn_request)
public void onRequestClick(View v) {
for (int i = 0; i < 5; i++) {
RetrofitUtil.getInstance()
.getProxy(IApiService.class)
.getResult(GlobalToken.getToken())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<ResultModel>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(ResultModel model) {
}
});
}
}
}
@@ -0,0 +1,34 @@
/*
* Copyright (C) 2016 david.wei (lighters)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.lighters.demos.token.http;
/**
* Created by david on 16/8/21.
* Email: huangdiv5@gmail.com
* GitHub: https://github.com/alighters
*/
public class GlobalToken {
private static String sToken;
public static synchronized void updateToken(String token) {
sToken = token;
}
public static String getToken() {
return sToken;
}
}
@@ -0,0 +1,81 @@
/*
* Copyright (C) 2016 david.wei (lighters)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.lighters.demos.token.http;
import com.lighters.demos.token.http.converter.GsonConverterFactory;
import com.lighters.demos.token.http.proxy.ProxyHandler;
import java.lang.reflect.Proxy;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
/**
* Created by david on 16/8/19.
* Email: huangdiv5@gmail.com
* GitHub: https://github.com/alighters
*/
public class RetrofitUtil {
public static final String API = "http://192.168.56.1:8888/";
private static Retrofit sRetrofit;
private static RetrofitUtil instance;
private final static Object mRetrofitLock = new Object();
private static Retrofit getRetrofit() {
if (sRetrofit == null) {
synchronized (mRetrofitLock) {
if (sRetrofit == null) {
OkHttpClient.Builder clientBuilder = new OkHttpClient().newBuilder();
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
clientBuilder.addInterceptor(httpLoggingInterceptor);
sRetrofit = new Retrofit.Builder().client(clientBuilder.build())
.baseUrl(API)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
}
}
return sRetrofit;
}
public static RetrofitUtil getInstance() {
if (instance == null) {
synchronized (RetrofitUtil.class) {
if (instance == null) {
instance = new RetrofitUtil();
}
}
}
return instance;
}
public <T> T get(Class<T> tClass) {
return getRetrofit().create(tClass);
}
@SuppressWarnings("unchecked")
public <T> T getProxy(Class<T> tClass) {
T t = getRetrofit().create(tClass);
return (T) Proxy.newProxyInstance(tClass.getClassLoader(), new Class<?>[] { tClass }, new ProxyHandler(t));
}
}
@@ -0,0 +1,32 @@
/*
* Copyright (C) 2016 david.wei (lighters)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.lighters.demos.token.http.api;
import com.google.gson.annotations.SerializedName;
/**
* Created by david on 16/8/21.
* Email: huangdiv5@gmail.com
* GitHub: https://github.com/alighters
*/
public class ApiModel<T> {
public boolean success;
@SerializedName("error_code") public int errorCode;
public T data;
}
@@ -0,0 +1,27 @@
/*
* Copyright (C) 2016 david.wei (lighters)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.lighters.demos.token.http.api;
/**
* Created by david on 16/8/21.
* Email: huangdiv5@gmail.com
* GitHub: https://github.com/alighters
*/
public class ErrorCode {
public static final int TOKEN_NOT_EXIST = 1000;
public static final int TOKEN_INVALID = 1001;
}
Oops, something went wrong.

0 comments on commit a7266be

Please sign in to comment.