MVP模式请求网络数据 ,防止内存泄漏

2017-12-11  本文已影响0人  Meimaobing

导入依赖
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'io.reactivex:rxjava:1.0.14'
compile 'com.facebook.fresco:fresco:0.11.0'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.jcodecraeer:xrecyclerview:1.3.2'

创建adpter
public class Myadpter extends RecyclerView.Adapter<Myadpter.MyViewHolder>{
Context context;
List<User.NewslistBean> list;
public Myadpter(Context context,List<User.NewslistBean> list){
this.context=context;
this.list=list;
}
@Override
public Myadpter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=View.inflate(context, R.layout.item,null);
MyViewHolder holder=new MyViewHolder(view);
return holder;
}

@Override
public void onBindViewHolder(Myadpter.MyViewHolder holder, int position) {
    holder.tv.setText(list.get(position).getTitle());
    DraweeController dc= Fresco.newDraweeControllerBuilder()
            .setUri(list.get(position).getPicUrl())
            .build();
    holder.sim.setController(dc);
}

@Override
public int getItemCount() {
    if (list!=null)
    {
        return list.size();
    }
    return 0;
}

public class MyViewHolder extends RecyclerView.ViewHolder {
    SimpleDraweeView sim;
    TextView tv;
    public MyViewHolder(View itemView) {
        super(itemView);
        sim=itemView.findViewById(R.id.sim);
        tv=itemView.findViewById(R.id.tv);
    }
}

}
初始化Fresco
public class Myapp extends Application{
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}
封装基类

public abstract class BaseActivity<T extends Mipp> extends Activity{
T presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createpresenter();
}

protected abstract void createpresenter();

@Override
protected void onDestroy() {
    super.onDestroy();
    if (presenter!=null)
    {
        presenter.detach();
    }
}

}
activity方法
public class MainActivity extends BaseActivity<Mypresenter> implements Iview {
int num=10;
XRecyclerView xrv;
Mypresenter mypresenter;
Handler handler;
Myadpter adpter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
presenter.getData();
}

private void initData() {
    xrv=findViewById(R.id.rv);
    xrv.setLoadingListener(new XRecyclerView.LoadingListener() {
        @Override
        public void onRefresh() {
            num+=5;
            adpter.notifyDataSetChanged();
            xrv.refreshComplete();
        }

        @Override
        public void onLoadMore() {
            num++;
            presenter.getData();
            adpter.notifyDataSetChanged();
            xrv.loadMoreComplete();
        }
    });
}

@Override
protected void createpresenter() {
    presenter=new Mypresenter(this);

}

@Override
public void showView(List<User.NewslistBean> list) {
    LinearLayoutManager mgs = new LinearLayoutManager(this);
    xrv.setLayoutManager(mgs);
    xrv.setAdapter(new Myadpter(MainActivity.this,list));

}

@Override
public int getNum() {
    return 0;
}

}
model层方法
public interface Imodel {
void setData(int num,Observer observer);
}
public class ImodelBack implements Imodel{

@Override
public void setData(int num, Observer observer) {
    OkHttpClient okHttpClient=new OkHttpClient.Builder().build();
    RetrofitManager.getInstance(RequestApi.BASE_URL,okHttpClient)
            .setCreate(RequestApi.class)
            .getObservable(num)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(observer);
}

}
presenter 层方法
public interface Mipp<T>{
void attach(T view);
void detach();
}
public class Mypresenter implements Mipp<Iview>{
Iview iview;
ImodelBack imodelBack;
SoftReference<Iview> reference;
public Mypresenter(Iview iview){
this.iview=iview;
imodelBack=new ImodelBack();
attach(iview);
}
public void getData(){
int num=reference.get().getNum();
imodelBack.setData(num, new Observer<User>() {
@Override
public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(User user) {
            List<User.NewslistBean> list=user.getNewslist();
            reference.get().showView(list);
        }
    });
}
@Override
public void attach(Iview view) {
    reference=new SoftReference<Iview>(view);
}

@Override
public void detach() {
    reference.clear();

}

}
网络地址
public interface RequestApi {
public static final String BASE_URL = "http://api.tianapi.com/";

@GET("nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10")
Observable<User> getObservable(@Query("num") int num);

}
封装retrofit
public class RetrofitManager {
private Retrofit mRetrofit;
private String baseUrl;
OkHttpClient client;
private static RetrofitManager mRetrofitManager;
private RetrofitManager(String baseUrl, OkHttpClient client)
{
this.baseUrl=baseUrl;
this.client=client;
initRetrofit();
}
public static synchronized RetrofitManager getInstance(String baseUrl,OkHttpClient client)
{
if (mRetrofitManager==null)
{
mRetrofitManager=new RetrofitManager(baseUrl,client);
}
return mRetrofitManager;
}

private void initRetrofit() {
     mRetrofit=new Retrofit.Builder()
             .baseUrl(baseUrl)
             .addConverterFactory(GsonConverterFactory.create())
             .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
             .client(client)
             .build();
}
public <T> T setCreate(Class<T> reqServer){
    return mRetrofit.create(reqServer);
}

}
view层方法
public interface Iview {
void showView(List<User.NewslistBean> list);
int getNum();
}

上一篇 下一篇

猜你喜欢

热点阅读