提交 9c5318bc 编写于 作者: J jessyan

add rxjava and cacheManager

上级 dbb35728
<component name="libraryTable">
<library name="api-0.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.Jolyglot/api/0.0.3/6576f5a0b4a58c4e245bea1ac5dec8ecd859aa02/api-0.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.Jolyglot/api/0.0.3/93b45a02de4ea393734f19ed548b717dcf4eb8e0/api-0.0.3-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="common-0.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.Jolyglot/common/0.0.3/25accaf0d3e57c6aec91ecd418c7a5cb2cd60040/common-0.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.Jolyglot/common/0.0.3/55e3e4a832b677e9a1320445d4d78f9ff74f18e8/common-0.0.3-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="core-1.6.2">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.RxCache/core/1.6.2/219d068108e8de4e561caf4570c1767f756794db/core-1.6.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.RxCache/core/1.6.2/5b9ce5f5c9edcdc74cd449455d81ef7a4cd23b75/core-1.6.2-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="rxjava-1.1.4">
<library name="dagger-2.6">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/io.reactivex/rxjava/1.1.4/3cc424c6eda381bf4aee40dc3ccdecc27b2106aa/rxjava-1.1.4.jar!/" />
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger/2.6/a2e0fb833ba928689fb8b8d9cc92a81298da7c37/dagger-2.6.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/io.reactivex/rxjava/1.1.4/ea3b0a7ebed1a5c9c25c3da977bdb9bc6b6f0b62/rxjava-1.1.4-sources.jar!/" />
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger/2.6/fb975122ce1999261c9586f4445aca56b6b8f8f5/dagger-2.6-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="gson-0.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.Jolyglot/gson/0.0.3/6d77f513f3c54f41c0fcc95557669e547aee0b43/gson-0.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.Jolyglot/gson/0.0.3/ca373d7361ebe5e64464d069181a5cdf49ab8304/gson-0.0.3-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="haha-2.0.2">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup.haha/haha/2.0.2/fd65b84d12d6adc77ec0e4fcaca623fc391d8679/haha-2.0.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="javax.annotation-10.0-b28">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.glassfish/javax.annotation/10.0-b28/30eb3b3cc9cb0863a4edaea5a7575f8ace1b96ba/javax.annotation-10.0-b28.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.glassfish/javax.annotation/10.0-b28/b1745c49bd24e5c09a82633b377f7bf2cc8fdace/javax.annotation-10.0-b28-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="leakcanary-analyzer-1.4-beta2">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup.leakcanary/leakcanary-analyzer/1.4-beta2/449777cd466ac0a16f7e8d0dc508e70e2cdd13a9/leakcanary-analyzer-1.4-beta2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="leakcanary-android-1.4-beta2">
<CLASSES>
<root url="file://$PROJECT_DIR$/arms/build/intermediates/exploded-aar/com.squareup.leakcanary/leakcanary-android/1.4-beta2/res" />
<root url="jar://$PROJECT_DIR$/arms/build/intermediates/exploded-aar/com.squareup.leakcanary/leakcanary-android/1.4-beta2/jars/classes.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="leakcanary-android-no-op-1.4-beta2">
<CLASSES>
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.squareup.leakcanary/leakcanary-android-no-op/1.4-beta2/jars/classes.jar!/" />
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.squareup.leakcanary/leakcanary-android-no-op/1.4-beta2/res" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup.leakcanary/leakcanary-android-no-op/1.4-beta2/6141ff7ef63164a4feea728988621ecdd628347d/leakcanary-android-no-op-1.4-beta2-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="leakcanary-watcher-1.4-beta2">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup.leakcanary/leakcanary-watcher/1.4-beta2/6a920fb0d14e5e3b36e37cf33b1eeef2bcce4c92/leakcanary-watcher-1.4-beta2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="runtime-1.6.2">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.RxCache/runtime/1.6.2/58c8df0b02527898a321edc4fb5105e3c40fc6c8/runtime-1.6.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.VictorAlbertos.RxCache/runtime/1.6.2/eb84fdbef77053366afa800f08d3594df63fce11/runtime-1.6.2-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="dagger-2.0.2">
<library name="rxjava-1.1.8">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger/2.0.2/de8416eda7b2fd7c25836b140c39e1cbf10542f6/dagger-2.0.2.jar!/" />
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/io.reactivex/rxjava/1.1.8/f9dbae366a6a3d6b5041c5e8db0dcdfdc35c27b5/rxjava-1.1.8.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger/2.0.2/d838907b82a0688de22a36cf0a764b36ce2716f6/dagger-2.0.2-sources.jar!/" />
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/io.reactivex/rxjava/1.1.8/7d96d6ca9fa1e45df8c4333666b2d849822140ab/rxjava-1.1.8-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
......@@ -42,8 +42,8 @@ buildscript {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
apt 'com.google.dagger:dagger-compiler:2.0.2'
testCompile rootProject.ext.dependencies["junit"]
apt rootProject.ext.dependencies["dagger2-apt-compiler"]
compile rootProject.ext.dependencies["cardview-v7"]
provided rootProject.ext.dependencies["javax.annotation"]
compile project(':arms')
......
package me.jessyan.mvparms.demo.app;
/**
* Created by jess on 8/30/16 16:39
* Contact with jess.yan.effort@gmail.com
*/
public interface EventBusTag {
}
package me.jessyan.mvparms.demo.app;
import com.jess.arms.base.BaseApplication;
import com.jess.arms.http.GlobeHttpResultHandler;
import me.jessyan.mvparms.demo.di.component.AppComponent;
import me.jessyan.mvparms.demo.di.component.DaggerAppComponent;
import me.jessyan.mvparms.demo.di.module.CacheModule;
import me.jessyan.mvparms.demo.di.module.ServiceModule;
import me.jessyan.mvparms.demo.mvp.model.api.Api;
import timber.log.Timber;
/**
* Created by jess on 8/5/16 11:07
......@@ -23,6 +26,7 @@ public class WEApplication extends BaseApplication {
.clientModule(getClientModule())
.imageModule(getImageModule())
.serviceModule(new ServiceModule())
.cacheModule(new CacheModule())
.build();
}
......@@ -34,4 +38,22 @@ public class WEApplication extends BaseApplication {
public AppComponent getAppComponent() {
return mAppComponent;
}
/**
* 这里可以提供一个全局处理http响应结果的处理类,
* 这里可以比客户端提前一步拿到服务器返回的结果,可以做一些操作,比如token超时,重新获取
* 默认不实现,如果有需求可以重写此方法
*
* @return
*/
@Override
public GlobeHttpResultHandler getHttpResultHandler() {
return new GlobeHttpResultHandler() {
@Override
public void onHttpResultResponse(String httpResult) {
Timber.tag(TAG).w("GlobeHttpResultHandler------>" + httpResult);
}
};
}
}
......@@ -10,7 +10,9 @@ import com.jess.arms.widget.imageloader.ImageLoader;
import javax.inject.Singleton;
import dagger.Component;
import me.jessyan.mvparms.demo.di.module.CacheModule;
import me.jessyan.mvparms.demo.di.module.ServiceModule;
import me.jessyan.mvparms.demo.mvp.model.api.cache.CacheManager;
import me.jessyan.mvparms.demo.mvp.model.api.service.ServiceManager;
import okhttp3.OkHttpClient;
......@@ -18,13 +20,18 @@ import okhttp3.OkHttpClient;
* Created by jess on 8/4/16.
*/
@Singleton
@Component(modules = {AppModule.class, ClientModule.class, ServiceModule.class, ImageModule.class})
@Component(modules = {AppModule.class, ClientModule.class, ServiceModule.class, ImageModule.class, CacheModule.class})
public interface AppComponent {
Application Application();
//服务管理器,retrofitApi
ServiceManager serviceManager();
//缓存管理器
CacheManager cacheManager();
OkHttpClient okHttpClient();
//图片管理器
ImageLoader imageLoader();
}
package me.jessyan.mvparms.demo.di.module;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import io.rx_cache.internal.RxCache;
import me.jessyan.mvparms.demo.mvp.model.api.cache.CommonCache;
/**
* Created by zhiyicx on 2016/3/30.
*/
@Module
public class CacheModule {
@Singleton
@Provides
CommonCache provideCommonService(RxCache rxCache) {
return rxCache.using(CommonCache.class);
}
}
......@@ -6,7 +6,6 @@ import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import me.jessyan.mvparms.demo.mvp.model.api.service.CommonService;
import me.jessyan.mvparms.demo.mvp.model.api.service.ServiceManager;
import retrofit2.Retrofit;
/**
......@@ -21,12 +20,4 @@ public class ServiceModule {
return retrofit.create(CommonService.class);
}
@Singleton
@Provides
ServiceManager provideServiceManager(CommonService commonService) {
return new ServiceManager(commonService);
}
}
package me.jessyan.mvparms.demo.mvp.model.api.cache;
import com.jess.arms.http.BaseCacheManager;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Created by jess on 8/30/16 13:54
* Contact with jess.yan.effort@gmail.com
*/
@Singleton
public class CacheManager extends BaseCacheManager{
private CommonCache mCommonCache;
@Inject public CacheManager(CommonCache commonCache) {
this.mCommonCache = commonCache;
}
public CommonCache getCommonCache() {
return mCommonCache;
}
}
package me.jessyan.mvparms.demo.mvp.model.api.cache;
import java.util.concurrent.TimeUnit;
import io.rx_cache.DynamicKey;
import io.rx_cache.EvictProvider;
import io.rx_cache.LifeCache;
import io.rx_cache.Reply;
import me.jessyan.mvparms.demo.mvp.model.entity.FindDetailEntity;
import me.jessyan.mvparms.demo.mvp.model.entity.FindMoreEntity;
import me.jessyan.mvparms.demo.mvp.model.entity.HomePicEntity;
import me.jessyan.mvparms.demo.mvp.model.entity.HotStrategyEntity;
import rx.Observable;
/**
* Created by jess on 8/30/16 13:53
* Contact with jess.yan.effort@gmail.com
*/
public interface CommonCache {
@LifeCache(duration = 2, timeUnit = TimeUnit.MINUTES)
Observable<Reply<HomePicEntity>> getDailyList(Observable<HomePicEntity> service, DynamicKey publishTime, EvictProvider provider);
@LifeCache(duration = 2, timeUnit = TimeUnit.MINUTES)
Observable<Reply<FindMoreEntity>> getFindMore(Observable<FindMoreEntity> service, DynamicKey id, EvictProvider provider);
@LifeCache(duration = 2, timeUnit = TimeUnit.MINUTES)
Observable<Reply<HotStrategyEntity>> getHotStrategy(Observable<HotStrategyEntity> service, DynamicKey id, EvictProvider provider);
@LifeCache(duration = 2, timeUnit = TimeUnit.MINUTES)
Observable<Reply<FindDetailEntity>> getFindDetail(Observable<FindDetailEntity> service, DynamicKey id, EvictProvider provider);
}
package me.jessyan.mvparms.demo.mvp.model.api.service;
import com.jess.arms.http.BaseServiceManager;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Created by jess on 8/5/16 13:01
* contact with jess.yan.effort@gmail.com
*/
public class ServiceManager {
@Singleton
public class ServiceManager extends BaseServiceManager {
private CommonService mCommonService;
public ServiceManager(CommonService commonService){
@Inject public ServiceManager(CommonService commonService){
this.mCommonService = commonService;
}
......
package me.jessyan.mvparms.demo.mvp.ui.activity;
import android.view.LayoutInflater;
import android.view.View;
import com.jess.arms.utils.UiUtils;
import io.rx_cache.DynamicKey;
import io.rx_cache.EvictDynamicKey;
import io.rx_cache.Reply;
import me.jessyan.mvparms.demo.R;
import me.jessyan.mvparms.demo.di.component.AppComponent;
import me.jessyan.mvparms.demo.mvp.model.entity.HomePicEntity;
import me.jessyan.mvparms.demo.mvp.ui.common.WEActivity;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import timber.log.Timber;
public class MainActivity extends WEActivity {
@Override
protected void setupActivityComponent(AppComponent appComponent) {
appComponent
.cacheManager()
.getCommonCache()
.getDailyList(appComponent
.serviceManager()
.getCommonService()
.getDailyList(),new DynamicKey("15"),new EvictDynamicKey(true))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(this.<Reply<HomePicEntity>>bindToLifecycle())
.subscribe(new Action1<Reply<HomePicEntity>>() {
@Override
public void call(Reply<HomePicEntity> homePicEntityReply) {
UiUtils.makeText(homePicEntityReply.getData().getIssueList().get(0).getPublishTime()+"/"+homePicEntityReply.getSource().name());
Timber.tag(TAG).w(homePicEntityReply.getData().getIssueList().get(0).getPublishTime()+"");
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});
}
@Override
protected View initView() {
return null;
return LayoutInflater.from(this).inflate(R.layout.activity_main,null,false);
}
@Override
......
......@@ -32,7 +32,7 @@ buildscript {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
testCompile rootProject.ext.dependencies["junit"]
compile rootProject.ext.dependencies["support-v4"]
compile rootProject.ext.dependencies["gson"]
compile rootProject.ext.dependencies["appcompat-v7"]
......@@ -45,6 +45,8 @@ dependencies {
compile rootProject.ext.dependencies["rxlifecycle"]
compile rootProject.ext.dependencies["rxlifecycle-components"]
provided rootProject.ext.dependencies["rxbinding-recyclerview-v7"]
compile rootProject.ext.dependencies["rxcache"]
compile rootProject.ext.dependencies["rxcache-jolyglot-gson"]
compile rootProject.ext.dependencies["retrofit"]
compile rootProject.ext.dependencies["retrofit-converter-gson"]
compile rootProject.ext.dependencies["retrofit-adapter-rxjava"]
......@@ -54,5 +56,8 @@ dependencies {
compile rootProject.ext.dependencies["okhttp3"]
compile rootProject.ext.dependencies["timber"]
compile rootProject.ext.dependencies["glide"]
apt 'com.google.dagger:dagger-compiler:2.0.2'
debugCompile rootProject.ext.dependencies["canary-debug"]
releaseCompile rootProject.ext.dependencies["canary-release"]
testCompile rootProject.ext.dependencies["canary-release"]
apt rootProject.ext.dependencies["dagger2-apt-compiler"]
}
......@@ -39,21 +39,17 @@ public abstract class BaseActivity<P extends BasePresenter> extends RxAppCompatA
@Override
public View onCreateView(String name, Context context, AttributeSet attrs)
{
public View onCreateView(String name, Context context, AttributeSet attrs) {
View view = null;
if (name.equals(LAYOUT_FRAMELAYOUT))
{
if (name.equals(LAYOUT_FRAMELAYOUT)) {
view = new AutoFrameLayout(context, attrs);
}
if (name.equals(LAYOUT_LINEARLAYOUT))
{
if (name.equals(LAYOUT_LINEARLAYOUT)) {
view = new AutoLinearLayout(context, attrs);
}
if (name.equals(LAYOUT_RELATIVELAYOUT))
{
if (name.equals(LAYOUT_RELATIVELAYOUT)) {
view = new AutoRelativeLayout(context, attrs);
}
......@@ -63,9 +59,6 @@ public abstract class BaseActivity<P extends BasePresenter> extends RxAppCompatA
}
@Override
protected void onResume() {
super.onResume();
......@@ -96,7 +89,6 @@ public abstract class BaseActivity<P extends BasePresenter> extends RxAppCompatA
/**
* 依赖注入的入口
*
*/
protected abstract void ComponentInject();
......@@ -120,7 +112,7 @@ public abstract class BaseActivity<P extends BasePresenter> extends RxAppCompatA
synchronized (BaseActivity.class) {
mApplication.getActivityList().remove(this);
}
mPresenter.onDestroy();//释放资源
if (mPresenter != null) mPresenter.onDestroy();//释放资源
ButterKnife.unbind(this);
EventBus.getDefault().unregister(this);
}
......
......@@ -4,13 +4,15 @@ import android.app.Application;
import android.content.Context;
import android.content.Intent;
import com.jess.arms.BuildConfig;
import com.jess.arms.di.module.AppModule;
import com.jess.arms.di.module.ClientModule;
import com.jess.arms.di.module.ImageModule;
import com.jess.arms.http.GlobeHttpResultHandler;
import com.squareup.leakcanary.LeakCanary;
import java.util.LinkedList;
import okhttp3.Interceptor;
import timber.log.Timber;
/**
......@@ -28,22 +30,35 @@ public abstract class BaseApplication extends Application {
private ClientModule mClientModule;
private AppModule mAppModule;
private ImageModule mImagerModule;
protected final String TAG = this.getClass().getSimpleName();
@Override
public void onCreate() {
super.onCreate();
mApplication = this;
this.mClientModule = new ClientModule(getBaseUrl());//用于提供okhttp和retrofit的单列
this.mClientModule = ClientModule//用于提供okhttp和retrofit的单列
.buidler()
.baseurl(getBaseUrl())
.globeHttpResultHandler(getHttpResultHandler())
.Interceptors(getInterceptors())
.build();
this.mAppModule = new AppModule(this);//提供application
this.mImagerModule = new ImageModule();//图片加载框架默认使用glide
if (BuildConfig.DEBUG) {//Timber
if (Config.Debug) {//Timber日志打印
Timber.plant(new Timber.DebugTree());
}
if (Config.useCanary) {//leakCanary内存泄露检查
LeakCanary.install(this);
}
}
public abstract String getBaseUrl();
/**
* 提供基础url给retrofit
* @return
*/
protected abstract String getBaseUrl();
public LinkedList<BaseActivity> getActivityList() {
......@@ -54,7 +69,6 @@ public abstract class BaseApplication extends Application {
}
public ClientModule getClientModule() {
return mClientModule;
}
......@@ -63,7 +77,30 @@ public abstract class BaseApplication extends Application {
return mAppModule;
}
public ImageModule getImageModule(){return mImagerModule;}
public ImageModule getImageModule() {
return mImagerModule;
}
/**
* 这里可以提供一个全局处理http响应结果的处理类,
* 这里可以比客户端提前一步拿到服务器返回的结果,可以做一些操作,比如token超时,重新获取
* 默认不实现,如果有需求可以重写此方法
*
* @return
*/
protected GlobeHttpResultHandler getHttpResultHandler() {
return null;
}
/**
* 用来提供interceptor,如果要提供额外的interceptor可以让子application实现此方法
* @return
*/
protected Interceptor[] getInterceptors() {
return null;
}
/**
* 返回上下文
......
......@@ -44,7 +44,6 @@ public abstract class BaseFragment<P extends BasePresenter> extends RxFragment {
/**
* 依赖注入的入口
*
*/
protected abstract void ComponentInject();
......@@ -58,7 +57,7 @@ public abstract class BaseFragment<P extends BasePresenter> extends RxFragment {
@Override
public void onDestroy() {
super.onDestroy();
mPresenter.onDestroy();//释放资源
if (mPresenter != null) mPresenter.onDestroy();//释放资源
EventBus.getDefault().unregister(this);
}
......
package com.jess.arms.base;
/**
* Created by jess on 8/30/16 17:00
* Contact with jess.yan.effort@gmail.com
*/
public class Config {
public static boolean Debug = true;
public static boolean useCanary = Debug;
}
......@@ -2,15 +2,19 @@ package com.jess.arms.di.module;
import android.app.Application;
import com.jess.arms.http.GlobeHttpResultHandler;
import com.jess.arms.http.RequestIntercept;
import com.jess.arms.utils.DataHelper;
import java.io.File;
import java.util.concurrent.TimeUnit;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import io.rx_cache.internal.RxCache;
import io.victoralbertos.jolyglot.GsonSpeaker;
import okhttp3.Cache;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
......@@ -27,18 +31,33 @@ import retrofit2.converter.gson.GsonConverterFactory;
public class ClientModule {
private static final int TOME_OUT = 10;
public static final int HTTP_RESPONSE_DISK_CACHE_MAX_SIZE = 10 * 1024 * 1024;//缓存文件最大值为10Mb
private HttpUrl mApiUrl = HttpUrl.parse("https://api.github.com/");
private HttpUrl mApiUrl;
private GlobeHttpResultHandler mHandler;
private Interceptor[] mInterceptors;
/**
* @param baseUrl
* @author: jess
* @date 8/5/16 11:03 AM
* @description: 设置baseurl
*/
public ClientModule(String baseUrl) {
this.mApiUrl = HttpUrl.parse(baseUrl);
private ClientModule(Buidler buidler) {
this.mApiUrl = buidler.apiUrl;
this.mHandler = buidler.handler;
this.mInterceptors = buidler.interceptors;
}
public static Buidler buidler() {
return new Buidler();
}
/**
* @param cache 缓存
* @param intercept 拦截器
* @return
* @author: jess
* @date 8/30/16 1:12 PM
* @description:提供OkhttpClient
*/
@Singleton
@Provides
OkHttpClient provideClient(Cache cache, Interceptor intercept) {
......@@ -46,6 +65,14 @@ public class ClientModule {
return configureClient(okHttpClient, cache, intercept);
}
/**
* @param client
* @param httpUrl
* @return
* @author: jess
* @date 8/30/16 1:13 PM
* @description: 提供retrofit
*/
@Singleton
@Provides
Retrofit provideRetrofit(OkHttpClient client, HttpUrl httpUrl) {
......@@ -61,17 +88,51 @@ public class ClientModule {
@Singleton
@Provides
Cache provideCache(Application application) {
return new Cache(DataHelper.getCacheFile(application), HTTP_RESPONSE_DISK_CACHE_MAX_SIZE);//设置缓存路径和大小
Cache provideCache(File cacheFile) {
return new Cache(cacheFile, HTTP_RESPONSE_DISK_CACHE_MAX_SIZE);//设置缓存路径和大小
}
@Singleton
@Provides
Interceptor provideIntercept() {
return new RequestIntercept();//打印请求信息的拦截器
return new RequestIntercept(mHandler);//打印请求信息的拦截器
}
/**
* 提供缓存地址
*/
@Singleton
@Provides
File provideCacheFile(Application application) {
return DataHelper.getCacheFile(application);
}
/**
* 提供RXCache客户端
*
* @param cacheDir 缓存路径
* @return
*/
@Singleton
@Provides
RxCache provideRxCache(File cacheDir) {
return new RxCache
.Builder()
.persistence(cacheDir, new GsonSpeaker());
}
/**
* @param builder
* @param client
* @param httpUrl
* @return
* @author: jess
* @date 8/30/16 1:15 PM
* @description:配置retrofit
*/
private Retrofit configureRetrofit(Retrofit.Builder builder, OkHttpClient client, final HttpUrl httpUrl) {
return builder
.baseUrl(new BaseUrl() {
......@@ -90,18 +151,60 @@ public class ClientModule {
* 配置okhttpclient
*
* @param okHttpClient
* @param Cache
* @param Interceptor
* @return
*/
private OkHttpClient configureClient(OkHttpClient.Builder okHttpClient, Cache cache, Interceptor intercept) {
return okHttpClient
OkHttpClient.Builder builder = okHttpClient
.connectTimeout(TOME_OUT, TimeUnit.SECONDS)
.readTimeout(TOME_OUT, TimeUnit.SECONDS)
.cache(cache)//设置缓存
.addNetworkInterceptor(intercept)
.addNetworkInterceptor(intercept);
if (mInterceptors != null && mInterceptors.length > 0) {//如果外部提供了interceptor的数组则遍历添加
for (Interceptor interceptor : mInterceptors) {
builder.addInterceptor(interceptor);
}
}
return builder
.build();
}
public static final class Buidler {
private HttpUrl apiUrl = HttpUrl.parse("https://api.github.com/");
private GlobeHttpResultHandler handler;
private Interceptor[] interceptors;
private Buidler() {
}
public Buidler baseurl(String baseurl) {//基础url
this.apiUrl = HttpUrl.parse(baseurl);
return this;
}
public Buidler globeHttpResultHandler(GlobeHttpResultHandler handler) {//用来处理http响应结果
this.handler = handler;
return this;
}
public Buidler Interceptors(Interceptor[] interceptors) {//动态添加任意个interceptor
this.interceptors = interceptors;
return this;
}
public ClientModule build() {
if (apiUrl == null) {
throw new IllegalStateException("baseurl is required");
}
return new ClientModule(this);
}
}
// .addNetworkInterceptor(new Interceptor() {
// @Override
// public Response intercept(Interceptor.Chain chain) throws IOException {
......
package com.jess.arms.http;
/**
* Created by jess on 8/30/16 16:00
* Contact with jess.yan.effort@gmail.com
*/
public abstract class BaseCacheManager {
}
package com.jess.arms.http;
/**
* Created by jess on 8/30/16 15:59
* Contact with jess.yan.effort@gmail.com
*/
public abstract class BaseServiceManager {
}
package com.jess.arms.http;
/**
* Created by jess on 8/30/16 17:47
* Contact with jess.yan.effort@gmail.com
*/
public interface GlobeHttpResultHandler {
void onHttpResultResponse(String httpResult);
}
package com.jess.arms.http;
import com.jess.arms.utils.LogUtils;
import java.io.IOException;
import java.nio.charset.Charset;
......@@ -19,17 +17,20 @@ import timber.log.Timber;
* Created by jess on 7/1/16.
*/
public class RequestIntercept implements Interceptor {
private String message;
private GlobeHttpResultHandler mHandler;
public RequestIntercept(GlobeHttpResultHandler handler) {
this.mHandler = handler;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Buffer requestbuffer = new Buffer();
if (request.body() != null) {
request.body().writeTo(requestbuffer);
} else {
LogUtils.warnInfo("request.body() == null");
Timber.tag("Request").w("request.body() == null");
}
//打印url信息
......@@ -58,7 +59,10 @@ public class RequestIntercept implements Interceptor {
String bodyString = buffer.clone().readString(charset);
Timber.tag("Response").w("Body------>" + bodyString);
if (mHandler!=null)//这里可以比客户端提前一步拿到服务器返回的结果,可以做一些操作,比如token超时,重新获取
mHandler.onHttpResultResponse(bodyString);
return originalResponse;
}
}
package com.jess.arms.mvp;
import com.jess.arms.http.BaseCacheManager;
import com.jess.arms.http.BaseServiceManager;
/**
* Created by jess on 8/5/16 12:55
* contact with jess.yan.effort@gmail.com
*/
public class BaseModel<T> {
protected T mServiceManager;
public class BaseModel<S extends BaseServiceManager, C extends BaseCacheManager> {
protected S mServiceManager;//服务管理类,用于网络请求
protected C mCacheManager;//缓存管理类,用于管理本地或者内存缓存
public BaseModel(T serviceManager) {
public BaseModel(S serviceManager, C cacheManager) {
this.mServiceManager = serviceManager;
this.mCacheManager = cacheManager;
}
public void onDestory() {
mServiceManager = null;
mCacheManager = null;
}
}
......@@ -41,6 +41,7 @@ public class BasePresenter<M extends BaseModel, V extends BaseView> implements p
public void onDestroy() {
EventBus.getDefault().unregister(this);//解除注册eventbus
unSubscribe();//解除订阅
mModel.onDestory();//释放资源
this.mModel = null;
this.mRootView = null;
}
......
......@@ -33,13 +33,6 @@ import java.lang.reflect.Field;
import java.text.NumberFormat;
import java.util.List;
/**
* 常用信息工具类
* Created by jungle on 16/5/21.
* com.zhiyicx.zhibo.util
* zhibo_android
* email:335891510@qq.com
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class DeviceUtils {
// 手机网络类型
......
......@@ -3,15 +3,11 @@ package com.jess.arms.utils;
import android.text.TextUtils;
import android.util.Log;
/**
* Created by jungle on 16/5/20.
* com.zhiyicx.zhibo.util
* zhibo_android
* email:335891510@qq.com
*/
public class LogUtils {
private final static boolean isLog = true;
public static final String DEFAULT_TAG = "Mvparms";
public static void debugInfo(String tag, String msg) {
if (!isLog || TextUtils.isEmpty(msg)) return;
......@@ -26,7 +22,7 @@ public class LogUtils {
* @param msg void
*/
public static void debugInfo(String msg) {
debugInfo("zhibo", msg);
debugInfo(DEFAULT_TAG, msg);
}
public static void warnInfo(String tag, String msg) {
......@@ -80,7 +76,7 @@ public class LogUtils {
* @param str void
*/
public static void debugLongInfo(String str) {
debugLongInfo("zhibo", str);
debugLongInfo(DEFAULT_TAG, str);
}
}
......@@ -15,6 +15,7 @@ buildscript {
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
......
......@@ -7,50 +7,59 @@ ext {
versionCode : 1,
versionName : "1.0",
androidSupportSdkVersion: "23.3.0",
retrofitSdkVersion : "2.0.0-beta4"
retrofitSdkVersion : "2.0.0-beta4",
dagger2SdkVersion : "2.6",
rxlifecycleSdkVersion : "0.6.1",
espressoSdkVersion : "2.2.2"
]
dependencies = [
"multidex" : "compile 'com.android.support:multidex:1.0.1'",
"androidJUnitRunner" : "android.support.test.runner.AndroidJUnitRunner",
"appcompat-v7" : "com.android.support:appcompat-v7:${android["androidSupportSdkVersion"]}",
"design" : "com.android.support:design:${android["androidSupportSdkVersion"]}",
"support-v4" : "com.android.support:support-v4:${android["androidSupportSdkVersion"]}",
"cardview-v7" : "com.android.support:cardview-v7:${android["androidSupportSdkVersion"]}",
"annotations" : "com.android.support:support-annotations:${android["androidSupportSdkVersion"]}",
"recyclerview-v7" : "com.android.support:recyclerview-v7:${android["androidSupportSdkVersion"]}",
"retrofit" : "com.squareup.retrofit2:retrofit:${android["retrofitSdkVersion"]}",
"retrofit-converter-gson": "com.squareup.retrofit2:converter-gson:${android["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava": "com.squareup.retrofit2:adapter-rxjava:${android["retrofitSdkVersion"]}",
"junit" : "junit:junit:4.12",
"okhttp3" : "com.squareup.okhttp3:okhttp:3.2.0",
"gson" : "com.google.code.gson:gson:2.6.2",
"autolayout" : "com.zhy:autolayout:1.4.1",
"butterknife" : "com.jakewharton:butterknife:7.0.1",
"glide" : "com.github.bumptech.glide:glide:3.7.0",
"androideventbus" : "org.simple:androideventbus:1.0.5.1",
"rxandroid" : "io.reactivex:rxandroid:1.1.0",
"rxjava" : "io.reactivex:rxjava:1.1.0",
"rxlifecycle" : "com.trello:rxlifecycle:0.6.1",
"rxlifecycle-components" : "com.trello:rxlifecycle-components:0.6.1",
"dagger2" : "com.google.dagger:dagger:2.0.2",
"rxbinding-recyclerview-v7":"com.jakewharton.rxbinding:rxbinding-recyclerview-v7:0.4.0",
"pickerview" : "com.bigkoo:pickerview:2.0.8",
"nineoldandroids" : "com.nineoldandroids:library:2.4.0",
"picasso" : "com.squareup.picasso:picasso:2.5.2",
"photoview" : "com.github.chrisbanes.photoview:library:1.2.3",
"numberprogressbar" : "com.daimajia.numberprogressbar:library:1.2@aar",
"umeng-analytics" : "com.umeng.analytics:analytics:6.0.1",
"okhttp-urlconnection" : "com.squareup.okhttp:okhttp-urlconnection:2.0.0",
"otto" : "com.squareup:otto:1.3.8",
"nineoldandroids" : "com.nineoldandroids:library:2.4.0",
"runner" : 'com.android.support.test:runner:0.5',
"espresso-core" : "com.android.support.test.espresso:espresso-core:2.2.2",
"espresso-contrib" : ("com.android.support.test.espresso:espresso-contrib:2.2.2"),
"espresso-intents" : "com.android.support.test.espresso:espresso-intents:2.2.2",
"mockito-core" : "org.mockito:mockito-core:1.+",
"timber" : "com.jakewharton.timber:timber:4.1.2",
"javax.annotation" : 'javax.annotation:jsr250-api:1.0'
"multidex" : "compile 'com.android.support:multidex:1.0.1'",
"androidJUnitRunner" : "android.support.test.runner.AndroidJUnitRunner",
"javax.annotation" : 'javax.annotation:jsr250-api:1.0',
"appcompat-v7" : "com.android.support:appcompat-v7:${android["androidSupportSdkVersion"]}",
"design" : "com.android.support:design:${android["androidSupportSdkVersion"]}",
"support-v4" : "com.android.support:support-v4:${android["androidSupportSdkVersion"]}",
"cardview-v7" : "com.android.support:cardview-v7:${android["androidSupportSdkVersion"]}",
"annotations" : "com.android.support:support-annotations:${android["androidSupportSdkVersion"]}",
"recyclerview-v7" : "com.android.support:recyclerview-v7:${android["androidSupportSdkVersion"]}",
"retrofit" : "com.squareup.retrofit2:retrofit:${android["retrofitSdkVersion"]}",
"retrofit-converter-gson" : "com.squareup.retrofit2:converter-gson:${android["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava:${android["retrofitSdkVersion"]}",
"junit" : "junit:junit:4.12",
"okhttp3" : "com.squareup.okhttp3:okhttp:3.2.0",
"gson" : "com.google.code.gson:gson:2.6.2",
"autolayout" : "com.zhy:autolayout:1.4.1",
"butterknife" : "com.jakewharton:butterknife:7.0.1",
"glide" : "com.github.bumptech.glide:glide:3.7.0",
"androideventbus" : "org.simple:androideventbus:1.0.5.1",
"rxandroid" : "io.reactivex:rxandroid:1.1.0",
"rxjava" : "io.reactivex:rxjava:1.1.0",
"rxlifecycle" : "com.trello:rxlifecycle:${android["rxlifecycleSdkVersion"]}",
"rxlifecycle-components" : "com.trello:rxlifecycle-components:${android["rxlifecycleSdkVersion"]}",
"rxcache" : "com.github.VictorAlbertos.RxCache:runtime:1.6.2",
"rxcache-jolyglot-gson" : "com.github.VictorAlbertos.Jolyglot:gson:0.0.3",
"dagger2" : "com.google.dagger:dagger:${android["dagger2SdkVersion"]}",
"dagger2-apt-compiler" : "com.google.dagger:dagger-compiler:${android["dagger2SdkVersion"]}",
"rxbinding-recyclerview-v7": "com.jakewharton.rxbinding:rxbinding-recyclerview-v7:0.4.0",
"pickerview" : "com.bigkoo:pickerview:2.0.8",
"nineoldandroids" : "com.nineoldandroids:library:2.4.0",
"picasso" : "com.squareup.picasso:picasso:2.5.2",
"photoview" : "com.github.chrisbanes.photoview:library:1.2.3",
"numberprogressbar" : "com.daimajia.numberprogressbar:library:1.2@aar",
"umeng-analytics" : "com.umeng.analytics:analytics:6.0.1",
"okhttp-urlconnection" : "com.squareup.okhttp:okhttp-urlconnection:2.0.0",
"otto" : "com.squareup:otto:1.3.8",
"nineoldandroids" : "com.nineoldandroids:library:2.4.0",
//test
"runner" : 'com.android.support.test:runner:0.5',
"espresso-core" : "com.android.support.test.espresso:espresso-core:${android["espressoSdkVersion"]}",
"espresso-contrib" : ("com.android.support.test.espresso:espresso-contrib:${android["espressoSdkVersion"]}"),
"espresso-intents" : "com.android.support.test.espresso:espresso-intents:${android["espressoSdkVersion"]}",
"mockito-core" : "org.mockito:mockito-core:1.+",
"timber" : "com.jakewharton.timber:timber:4.1.2",
"canary-debug" : "com.squareup.leakcanary:leakcanary-android:1.4-beta2",
"canary-release" : "com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2"
]
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册