Skip to content

添加了一些Utils并加入缓存 #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 4 additions & 10 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,24 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tufei.architecturedemo">

<uses-permission android:name="android.permission.INTERNET"/>

<application
android:name=".App"
android:name="com.tufei.architecturedemo.App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".mvp.splash.SplashActivity">
<activity android:name="com.tufei.architecturedemo.mvp.splash.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".mvp.main.MainActivity">
</activity>
<activity android:name=".mvp.EmptyActivity">
</activity>
<activity android:name=".mvp.face.FaceActivity">
<activity android:name="com.tufei.architecturedemo.mvp.main.MainActivity">
</activity>
<activity android:name=".mvp.Single.SingleActivity">
<activity android:name="com.tufei.architecturedemo.mvp.EmptyActivity">
</activity>
</application>

Expand Down
31 changes: 29 additions & 2 deletions app/src/main/java/com/tufei/architecturedemo/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.tufei.architecturedemo.di.AppComponent;
import com.tufei.architecturedemo.di.DaggerAppComponent;
import com.tufei.architecturedemo.utils.Utils;

import dagger.android.AndroidInjector;
import dagger.android.DaggerApplication;
Expand All @@ -10,7 +11,7 @@
* 我们创建一个定制的{@link App}类,继承自{@link DaggerApplication}。
* 然后覆盖{@link DaggerApplication#applicationInjector()}方法,告诉Dagger如何为我们创建一个单例的Component。
* 我们完全不用调用`component.inject(this)`,因为{@link DaggerApplication}将会帮我们完成这些操作。
*
* <p>
* We create a custom {@link App} class that extends {@link DaggerApplication}.
* We then override applicationInjector() which tells Dagger how to make our @Singleton Component
* We never have to call `component.inject(this)` as {@link DaggerApplication} will do that for us.
Expand All @@ -19,11 +20,37 @@
* @date 2017/9/11
*/

public class App extends DaggerApplication {
public abstract class App extends DaggerApplication {
private static App appContext;

@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
AppComponent appComponent = DaggerAppComponent.builder().application(this).build();
appComponent.inject(this);
return appComponent;
}

@Override
public void onCreate() {
super.onCreate();
appContext = this;
//初始化工具类
Utils.init(this, debugMode());
//初始化数据库
// Realm.init(this);
}

public static App getAppContext() {
return appContext;
}

/**
* 设置debug模式,推荐返回app的BuildConfig.DEBUG
*/
public abstract boolean debugMode();

/**
* 配置应用文件保存的根路径
*/
public abstract String getAppRootPath();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.tufei.architecturedemo.base.mvp;

import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
Expand All @@ -20,7 +19,7 @@
/**
* BaseActivity要继承{@link DaggerAppCompatActivity},而不再是{@link AppCompatActivity}
* 或者你点开{@link DaggerAppCompatActivity},把他的不多的代码放到你的BaseActivity里,
* 继续继承AppCompatActivity,或者是你想要继承的类
* 继续extends AppCompatActivity(傻吧你?)
*
* @author tufei
* @date 2017/6/27
Expand All @@ -32,7 +31,6 @@ public abstract class BaseActivity extends DaggerAppCompatActivity {
*/
protected String TAG = getClass().getSimpleName();
private List<IBasePresenter> presenterList;
private List<Dialog> mDialogList;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
Expand Down Expand Up @@ -74,7 +72,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
public <T extends IBasePresenter> void attach(T t) {
if (!(this instanceof IBaseView)) {
throw new RuntimeException(this.getClass().getSimpleName() +
" didn't implement the interface for View that base on IBaseView!");
"didn't implement the interface for View that base on IBaseView!");
}
//也考虑了 一个view同时绑定多个presenter的情况 (つд⊂)其实基本用不到
if (presenterList == null) {
Expand All @@ -95,32 +93,6 @@ public <T extends IBasePresenter> void detach(T t) {
t.onDetachView();
}

/**
* 存储dialog
*
* @param dialog
*/
public void addDialog(Dialog dialog) {
if (mDialogList == null) {
mDialogList = new ArrayList<>();
}
mDialogList.add(dialog);
}

/**
* 关掉所有dialog
*/
public void dismissAllDialog() {
if (mDialogList != null && mDialogList.size() > 0) {
for (Dialog dialog : mDialogList) {
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
mDialogList.clear();
}
}

/**
* 界面跳转,不需要添加额外信息的时候(一切为了偷懒)
*
Expand All @@ -135,8 +107,6 @@ public void startActivity(@NonNull Class<?> clazz) {
@Override
protected void onDestroy() {
ActivityCollector.removeActivity(this);
//关闭所有没有及时关闭的dialog
dismissAllDialog();
//执行presenter里的onDetachView方法
if (presenterList != null && presenterList.size() > 0) {
Iterator<IBasePresenter> iterator = presenterList.iterator();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
/**
* BaseFragment要继承{@link DaggerFragment},而不再是{@link android.support.v4.app.Fragment}
* <p>
* 1)如果你要使用的是{@link android.support.v4.app.Fragment},那就继承{@link dagger.android.support.DaggerFragment}
* 1)如果你要使用的是{@link android.support.v4.app.Fragment},那就继承{@link DaggerFragment}
* 2)如果你要使用的是{@link android.app.Fragment},那就继承{@link dagger.android.DaggerFragment}
* 3)或者你两者都要用..那就点开上述两个类,把它们的代码都拷贝过来放在你的BaseFragment就是了..
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,22 @@
* @date 2017/9/11
*/

@SuppressWarnings("unused")
public class NetConstants {
public static final long HTTP_CONNECT_TIMEOUT = 5000;
public static final long HTTP_READ_TIMEOUT = 5000;
public static final String BASE_URL = "https://aip.baidubce.com/rest/2.0/face/v2/";
public static final String BASE_URL = "http://www.nishabi.com";

//add some constants
public static final int NET_CODE_SUCCESS = 0;
public static final int NET_CODE_ERROR = 1;

public static final int NET_CODE_CONNECT = 400;
public static final int NET_CODE_UNKNOWN_HOST = 401;
public static final int NET_CODE_SOCKET_TIMEOUT = 402;

public static final String CONNECT_EXCEPTION = "网络连接异常,请检查您的网络状态";
public static final String SOCKET_TIMEOUT_EXCEPTION = "网络连接超时,请检查您的网络状态,稍后重试";
public static final String UNKNOWN_HOST_EXCEPTION = "与服务器连接失败";
public static final String EMPTY_RESPONSE_EXCEPTION = "无效的返回";
}
182 changes: 182 additions & 0 deletions app/src/main/java/com/tufei/architecturedemo/core/retrofit/RxUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
package com.tufei.architecturedemo.core.retrofit;

import android.app.Dialog;
import android.content.DialogInterface;
import android.support.annotation.NonNull;

import com.trello.rxlifecycle2.LifecycleProvider;
import com.trello.rxlifecycle2.LifecycleTransformer;
import com.trello.rxlifecycle2.android.ActivityEvent;
import com.trello.rxlifecycle2.android.FragmentEvent;
import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;
import com.trello.rxlifecycle2.components.support.RxFragment;
import com.tufei.architecturedemo.core.retrofit.function.RetryWithDelay;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableTransformer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;

/**
* Created by wjc on 2018/1/2.RxLifecycle绑定工具类
*/
@SuppressWarnings("unused")
public class RxUtil {
private static <T> LifecycleTransformer<T> bindToLifecycle(LifecycleProvider provider) {
if (provider instanceof RxAppCompatActivity) {
return ((RxAppCompatActivity) provider).bindToLifecycle();
} else if (provider instanceof RxFragment) {
return ((RxFragment) provider).bindToLifecycle();
} else {
throw new IllegalArgumentException("class must extents RxAppCompatActivity or RxFragment");
}
}

private static <T> LifecycleTransformer<T> bindToLifecycle(LifecycleProvider provider, ActivityEvent event) {
if (provider instanceof RxAppCompatActivity) {
return ((RxAppCompatActivity) provider).bindUntilEvent(event);
} else {
throw new IllegalArgumentException("class must extents RxAppCompatActivity");
}
}

private static <T> LifecycleTransformer<T> bindToLifecycle(LifecycleProvider provider, FragmentEvent event) {
if (provider instanceof RxFragment) {
return ((RxFragment) provider).bindUntilEvent(event);
} else {
throw new IllegalArgumentException("class must extents RxFragment");
}
}

public static <T> ObservableTransformer<T, T> applySchedulers(final LifecycleProvider provider) {
return new ObservableTransformer<T, T>() {
@Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream
.retryWhen(new RetryWithDelay())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(RxUtil.<T>bindToLifecycle(provider));

}
};
}

public static <T> ObservableTransformer<T, T> applySchedulers(final LifecycleProvider provider, final ActivityEvent event) {
return new ObservableTransformer<T, T>() {
@Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream
.retryWhen(new RetryWithDelay())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(RxUtil.<T>bindToLifecycle(provider, event));

}
};
}

public static <T> ObservableTransformer<T, T> applySchedulers(final LifecycleProvider provider, final FragmentEvent event) {
return new ObservableTransformer<T, T>() {
@Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream
.retryWhen(new RetryWithDelay())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(RxUtil.<T>bindToLifecycle(provider, event));

}
};
}

public static <T> ObservableTransformer<T, T> applySchedulers(final LifecycleProvider provider, @NonNull final Dialog dialog) {
return new ObservableTransformer<T, T>() {
@Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream
.delay(1, TimeUnit.SECONDS)
.retryWhen(new RetryWithDelay())
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(@NonNull final Disposable disposable) throws Exception {
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override public void onCancel(DialogInterface dialog) {
disposable.dispose();
}
});
dialog.show();
}
})
.observeOn(AndroidSchedulers.mainThread())
.doOnTerminate(new Action() {
@Override public void run() throws Exception {
dialog.dismiss();
}
})
.compose(RxUtil.<T>bindToLifecycle(provider));
}
};
}

public static <T> ObservableTransformer<T, T> applySchedulers(final LifecycleProvider provider, final ActivityEvent event, @NonNull final Dialog dialog) {
return new ObservableTransformer<T, T>() {
@Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream
.delay(1, TimeUnit.SECONDS)
.retryWhen(new RetryWithDelay())
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(@NonNull final Disposable disposable) throws Exception {
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override public void onCancel(DialogInterface dialog) {
disposable.dispose();
}
});
dialog.show();
}
})
.observeOn(AndroidSchedulers.mainThread())
.doOnTerminate(new Action() {
@Override public void run() throws Exception {
dialog.dismiss();
}
})
.compose(RxUtil.<T>bindToLifecycle(provider, event));
}
};
}

public static <T> ObservableTransformer<T, T> applySchedulers(final LifecycleProvider provider, final FragmentEvent event, @NonNull final Dialog dialog) {
return new ObservableTransformer<T, T>() {
@Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream
.delay(1, TimeUnit.SECONDS)
.retryWhen(new RetryWithDelay(2,5000))
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(@NonNull final Disposable disposable) throws Exception {
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override public void onCancel(DialogInterface dialog) {
disposable.dispose();
}
});
dialog.show();
}
})
.observeOn(AndroidSchedulers.mainThread())
.doOnTerminate(new Action() {
@Override public void run() throws Exception {
dialog.dismiss();
}
})
.compose(RxUtil.<T>bindToLifecycle(provider, event));
}
};
}
}
Loading