依赖
compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' // retrofit的依赖 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-scalars:2.0.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' //rxjava的依赖 compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0-RC3' compile 'com.squareup.okhttp3:logging-interceptor:3.2.0' compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC3' compile 'com.squareup.okio:okio:1.5.0' compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' //dagger annotationProcessor 'com.google.dagger:dagger-compiler:2.4' compile 'com.google.dagger:dagger:2.4' provided 'org.glassfish:javax.annotation:10.0-b28'
包结构
package com.lingtian.networkframework.base; import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.WindowManager; import butterknife.ButterKnife; /** * Created by Dell on 2018/2/8. */ public abstract class BaseActivity<V ,P extends BasePresenter> extends AppCompatActivity { private P presnter; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayout()); //ButterKnife绑定 ButterKnife.bind(this); //沉浸状态栏 // StatusBarCompat.compat(this, getResources().getColor(R.color.colorAccent)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上 View decorView = getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); getWindow().setStatusBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0 WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes(); localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags); } initDagger(); presnter= getPresenter(); if (presnter != null){ presnter.attach(this); } initView(); initData(); } public abstract void initDagger(); public abstract void initView(); protected abstract void initData(); public abstract int getLayout(); public abstract P getPresenter(); @Override protected void onDestroy() { super.onDestroy(); if(presnter!= null){ presnter.removeCompositeDisposable(); presnter.detachview(); } } }
package com.lingtian.networkframework.base; import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import butterknife.ButterKnife; /** * Created by Dell on 2018/2/8. */ public abstract class BaseFragment<V , P extends BasePresenter> extends Fragment{ private P presenter; private View view; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //绑定ButterKnife View view = inflater.inflate(getLayout(), container, false); ButterKnife.bind(this, view); initDagger(); //沉浸式 // StatusBarCompat.compat(getActivity(), getResources().getColor(R.color.colorAccent)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上 View decorView = getActivity().getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0 WindowManager.LayoutParams localLayoutParams = getActivity().getWindow().getAttributes(); localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags); } presenter = getPresenter(); if (presenter != null) { presenter.attach((V) this); } view = inflater.inflate(getLayout(), container, false); initView(view); return view; } protected void initDagger(){}; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(); } protected abstract void initData(); protected abstract void initView(View view); protected abstract int getLayout(); protected abstract P getPresenter(); @Override public void onDestroy() { super.onDestroy(); if(presenter !=null){ presenter.removeCompositeDisposable(); presenter.detachview(); } } }
package com.lingtian.networkframework.base; import java.lang.ref.WeakReference; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; /** * Created by Dell on 2018/2/8. */ public class BasePresenter<V> { private WeakReference<V> weakReference; private CompositeDisposable compositeDisposable; //关联View public void attach(V view){ weakReference = new WeakReference(view); } //解除关联 public void detachview(){ if(isattch()){ weakReference.clear(); weakReference = null; } } //判断是否关联 public boolean isattch(){ return weakReference!=null&weakReference.get()!=null; } //得到View public V getView(){ return isattch()?weakReference.get():null; } //添加订阅管理器 public void addCompositeDisposable(Disposable disposable){ if(compositeDisposable==null){ compositeDisposable = new CompositeDisposable(); } compositeDisposable.add(disposable); } //清除订阅管理器 public void removeCompositeDisposable(){ if(compositeDisposable!=null){ compositeDisposable.clear(); compositeDisposable= null; } } }
package com.lingtian.networkframework.model.api; /** * Created by AS on 2018/4/23. */ public class Api { public static final String HOST = "http://api.svipmovie.com/front/"; }
package com.lingtian.networkframework.model.api; import com.lingtian.networkframework.model.bean.Bean; import com.lingtian.networkframework.model.bean.PlayerBean; import java.util.Map; import io.reactivex.Flowable; import io.reactivex.Observable; import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.POST; import retrofit2.http.Url; /** * Created by AS on 2018/4/23. */ public interface ApiService { @GET("homePageApi/homePage.do") Flowable<Bean> get(); @FormUrlEncoded @POST("videoDetailApi/videoDetail.do") Flowable<PlayerBean> post(@FieldMap Map<String,String> map); }
package com.lingtian.networkframework.model; import com.lingtian.networkframework.model.api.Api; import com.lingtian.networkframework.model.api.ApiService; import com.lingtian.networkframework.model.bean.Bean; import com.lingtian.networkframework.model.bean.PlayerBean; import com.lingtian.networkframework.utils.retrofit.RetrofitClent; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import io.reactivex.Flowable; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import io.reactivex.subscribers.DefaultSubscriber; /** * Created by AS on 2018/4/23. */ public class FindModel implements IFindMidel{ @Inject public FindModel(){ } @Override public void getPlayer(String k, String v, final SendData sendData) { ApiService apiService = RetrofitClent.getRetrofitClientInstance().getApiService(ApiService.class, Api.HOST); Map<String, String> map = new HashMap<>(); map.put(k,v); Flowable<PlayerBean> flowable = apiService.post(map); flowable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DefaultSubscriber<PlayerBean>() { @Override public void onNext(PlayerBean playerBean) { sendData.send(playerBean); } @Override public void onError(Throwable t) { } @Override public void onComplete() { } }); } @Override public void getHome(final SendData sendData) { ApiService apiService = RetrofitClent.getRetrofitClientInstance().getApiService(ApiService.class, Api.HOST); Flowable<Bean> flowable = apiService.get(); flowable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DefaultSubscriber<Bean>() { @Override public void onNext(Bean bean) { sendData.send(bean); } @Override public void onError(Throwable t) { } @Override public void onComplete() { } }); } public interface SendData{ void send(Object o); } }
package com.lingtian.networkframework.model; /** * Created by AS on 2018/4/23. */ public interface IFindMidel { void getPlayer(String k, String v, FindModel.SendData sendData); void getHome(FindModel.SendData sendData); }
package com.lingtian.networkframework.model; import com.lingtian.networkframework.model.bean.Bean; import io.reactivex.Flowable; /** * Created by AS on 2018/4/23. */ public interface IModel { Flowable<Bean> get(); }
package com.lingtian.networkframework.model; import com.lingtian.networkframework.model.api.Api; import com.lingtian.networkframework.model.api.ApiService; import com.lingtian.networkframework.model.bean.Bean; import com.lingtian.networkframework.utils.retrofit.RetrofitClent; import javax.inject.Inject; import io.reactivex.Flowable; /** * Created by AS on 2018/4/23. */ public class Model implements IModel{ @Inject public Model() { } @Override public Flowable<Bean> get() { return RetrofitClent.getRetrofitClientInstance().getApiService(ApiService.class, Api.HOST).get(); } }
package com.lingtian.networkframework.presenter; import com.lingtian.networkframework.base.BasePresenter; import com.lingtian.networkframework.model.FindModel; import com.lingtian.networkframework.model.bean.Bean; import com.lingtian.networkframework.model.bean.PlayerBean; import com.lingtian.networkframework.view.inface.FindView; import javax.inject.Inject; /** * Created by AS on 2018/4/23. */ public class FindPresenter extends BasePresenter<FindView>{ @Inject public FindPresenter(){ } @Inject FindModel model; public void getPlayer(String k,String v){ model.getPlayer(k, v, new FindModel.SendData() { @Override public void send(Object o) { getView().getPlayerView((PlayerBean)o); } }); } public void gethome(){ model.getHome(new FindModel.SendData() { @Override public void send(Object o) { getView().getHome((Bean) o); } }); } }
package com.lingtian.networkframework.presenter; import android.util.Log; import android.widget.Toast; import com.lingtian.networkframework.base.BasePresenter; import com.lingtian.networkframework.model.Model; import com.lingtian.networkframework.model.bean.Bean; import com.lingtian.networkframework.view.inface.IView; import javax.inject.Inject; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import io.reactivex.subscribers.DisposableSubscriber; /** * Created by AS on 2018/4/23. */ public class Presenter extends BasePresenter<IView>{ @Inject public Presenter() { } @Inject Model model; public void geta(){ model.get() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSubscriber<Bean>() { @Override public void onNext(Bean homeBean) { getView().get(homeBean); } @Override public void onError(Throwable t) { } @Override public void onComplete() { } }); } }
package com.lingtian.networkframework.utils.dagger; import com.lingtian.networkframework.Main2Activity; import com.lingtian.networkframework.MainActivity; import dagger.Component; /** * Created by Dell on 2017/12/12. */ @Component(modules = MyMoudle.class) public interface MyComponent { void inject(MainActivity mainActivity); void injectplayer(Main2Activity main2Activity); }
package com.lingtian.networkframework.utils.dagger; import dagger.Module; /** * Created by Dell on 2017/12/12. */ @Module public class MyMoudle { }
package com.lingtian.networkframework.utils.retrofit; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; /** * Created by AS on 2018/4/23. * 类的用途 联网判断 */ public class NetWorkUtils { //判断网络是否连接 public static boolean isNetWorkAvailable(Context context) { //网络连接管理器 ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); //网络信息 NetworkInfo info = connectivityManager.getActiveNetworkInfo(); if (info != null) { return true; } return false; } }
package com.lingtian.networkframework.utils.retrofit; import android.os.Environment; import android.util.Log; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import com.lingtian.networkframework.view.application.Myapp; import java.io.File; import java.io.IOException; import okhttp3.Cache; import okhttp3.CacheControl; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; /** * 1:类的用途 * 2:@author Dell * 3:@date 2017/12/4 */ public class RetrofitClent { private static RetrofitClent retrofitClent; private static Retrofit retrofit; private RetrofitClent() { } public static RetrofitClent getRetrofitClientInstance(){ if (retrofitClent == null){ synchronized (RetrofitClent.class){ if (retrofitClent == null){ retrofitClent = new RetrofitClent(); } } } return retrofitClent; } public static synchronized Retrofit getRetrofit(String baseUrl){ //缓存目录 File sdcache = new File(Environment.getExternalStorageDirectory(), "cache"); int cacheSize = 10 * 1024 * 1024; HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { Log.i("xxx",message); } }).setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(interceptor) .addNetworkInterceptor(new CacheInterceptor()) .cache(new Cache(sdcache, cacheSize)) .build(); retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(okHttpClient) .baseUrl(baseUrl) .build(); return retrofit; } public static <T>T getApiService(Class<T> apiService,String baseUrl){ Retrofit retrofit = getRetrofit(baseUrl); return retrofit.create(apiService); } /** * 为okhttp添加缓存,这里是考虑到服务器不支持缓存时,从而让okhttp支持缓存 */ private static class CacheInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { // 有网络时 设置缓存超时时间1个小时 int maxAge = 60 * 60; // 无网络时,设置超时为1天 int maxStale = 60 * 60 * 24; Request request = chain.request(); if (NetWorkUtils.isNetWorkAvailable(Myapp.getmInstance())) { //有网络时只从网络获取 request = request.newBuilder().cacheControl(CacheControl.FORCE_NETWORK).build(); } else { //无网络时只从缓存中读取 request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build(); /* Looper.prepare(); Toast.makeText(MyApp.getInstance(), "走拦截器缓存", Toast.LENGTH_SHORT).show(); Looper.loop();*/ } Response response = chain.proceed(request); if (NetWorkUtils.isNetWorkAvailable(Myapp.getmInstance())) { response = response.newBuilder() .removeHeader("Pragma") .header("Cache-Control", "public, max-age=" + maxAge) .build(); } else { response = response.newBuilder() .removeHeader("Pragma") .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); } return response; } } }
package com.lingtian.networkframework.view.application; import android.app.Application; /** * Created by AS on 2018/4/23. */ public class Myapp extends Application { public static Myapp getappConnect; @Override public void onCreate() { super.onCreate(); getappConnect = this; } public static Myapp getmInstance(){ return getappConnect; } }
package com.lingtian.networkframework.view.inface; import com.lingtian.networkframework.model.bean.Bean; import com.lingtian.networkframework.model.bean.PlayerBean; /** * Created by AS on 2018/4/23. */ public interface FindView { void getPlayerView(PlayerBean playerBean); void getHome(Bean bean); }
package com.lingtian.networkframework.view.inface; import com.lingtian.networkframework.model.bean.Bean; /** * Created by AS on 2018/4/23. */ public interface IView { void get(Bean bean); }
package com.lingtian.networkframework; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import com.lingtian.networkframework.base.BaseActivity; import com.lingtian.networkframework.model.bean.Bean; import com.lingtian.networkframework.model.bean.PlayerBean; import com.lingtian.networkframework.presenter.FindPresenter; import com.lingtian.networkframework.utils.dagger.DaggerMyComponent; import com.lingtian.networkframework.view.inface.FindView; import javax.inject.Inject; public class Main2Activity extends BaseActivity<FindView,FindPresenter> implements FindView { @Inject FindPresenter presenter; @Override public void initDagger() { DaggerMyComponent.create().injectplayer(this); } @Override public void initView() { } @Override protected void initData() { presenter.getPlayer("mediaId","2b73398376fe4142ac0c6685cd654f6a"); presenter.gethome(); } @Override public int getLayout() { return R.layout.activity_main2; } @Override public FindPresenter getPresenter() { return presenter; } @Override public void getPlayerView(PlayerBean playerBean) { } @Override public void getHome(Bean bean) { Toast.makeText(this, "" + bean.getMsg(), Toast.LENGTH_LONG).show(); } }
package com.lingtian.networkframework; import android.util.Log; import android.widget.Toast; import com.lingtian.networkframework.base.BaseActivity; import com.lingtian.networkframework.model.bean.Bean; import com.lingtian.networkframework.presenter.Presenter; import com.lingtian.networkframework.utils.dagger.DaggerMyComponent; import com.lingtian.networkframework.view.inface.IView; import javax.inject.Inject; public class MainActivity extends BaseActivity<IView, Presenter> implements IView { @Inject Presenter presenter; @Override public void initDagger() { DaggerMyComponent.create().inject(this); } @Override public void initView() { presenter.geta(); } @Override protected void initData() { } @Override public int getLayout() { return R.layout.activity_main; } @Override public Presenter getPresenter() { return presenter; } @Override public void get(Bean bean) { Log.d("--------------------", "sasa"); Toast.makeText(this, "数据展示" + bean.getMsg(), Toast.LENGTH_LONG).show(); } }
/* compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' compile 'com.hjm:BottomTabBar:1.1.1' compile 'com.github.bumptech.glide:glide:3.7.0' // implementation files('libs/nineoldandroids-2.4.0.jar') annotationProcessor 'com.google.dagger:dagger-compiler:2.4' compile 'com.google.dagger:dagger:2.4' provided 'org.glassfish:javax.annotation:10.0-b28' // retrofit的依赖 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile'com.squareup.retrofit2:converter-gson:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-scalars:2.0.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' // rxjava的依赖 compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0-RC3' compile 'com.squareup.okhttp3:logging-interceptor:3.2.0' compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC3' compile 'com.squareup.okio:okio:1.5.0' compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.youth.banner:banner:1.4.10'*/
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:name=".view.application.Myapp"