Android网络框架

依赖

    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"















猜你喜欢

转载自blog.csdn.net/zhang823253467/article/details/80063205
今日推荐