一.Api
1.GetDataInterface
public interface GetDataInterface { @GET("/toutiao/index") Call<UserBean> get(@Query("key") String key); @FormUrlEncoded @POST("/toutiao/index") Call<UserBean> post(@Field("key") String key); }
2.
MyApi
public class MyApi extends Application{ //设置公共变量 public static DaoSession session; public static GetDataInterface request; @Override public void onCreate() { super.onCreate(); //1. 用于全局配置初始化Fresco 图片加载 Fresco.initialize(this); //2. 用于全局配置初始化Retrofit 网络请求 //构建Retrofit类,初始化参数 Retrofit retrofit = new Retrofit.Builder() .baseUrl(HttpUtils.goods_url) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); //创建网络请求接口实例 request = retrofit.create(GetDataInterface.class); //3. 用于全局配置初始化GreenDao数据库 // DaoMaster.DevOpenHelper database = new DaoMaster.DevOpenHelper(this, "database"); // Database db = database.getWritableDb(); //获取能读能写的数据库 // session = new DaoMaster(db).newSession(); } }
3.HttpUtils
public class HttpUtils { public static String goods_url = "http://v.juhe.cn"; }
二.Model
1.
ModelCallBack
public interface ModelCallBack {
public void onSuccess(UserBean bean);
public void onError(Exception e);
}
2.MyModel
public class MyModel { /** * get请求 * @param callBack */ public void getData(final ModelCallBack callBack){ //设置接口请求的key值 Call<UserBean> call = MyApi.request.get("c4479ad58f41e7f78a8fa073d0b1f1b5"); call.enqueue(new Callback<UserBean>() { @Override public void onResponse(Call<UserBean> call, Response<UserBean> response) { //获取响应的数据,保存在数据库中 UserBean bean = response.body(); // MyApi.session.getUserDao().insertInTx(bean.getResult().getData()); callBack.onSuccess(bean); } @Override public void onFailure(Call<UserBean> call, Throwable t) { //请求失败时返回数据 callBack.onError(new Exception("")); } }); } /** * post请求 * @param callBack */ public void postData(final ModelCallBack callBack){ //设置接口请求的key值 Call<UserBean> call = MyApi.request.post("c4479ad58f41e7f78a8fa073d0b1f1b5"); //发起异步请求 call.enqueue(new Callback<UserBean>() { @Override public void onResponse(Call<UserBean> call, Response<UserBean> response) { UserBean bean= response.body(); //MyApi.session.getUserDao().insertInTx(bean.getResult().getData()); callBack.onSuccess(bean); } @Override public void onFailure(Call<UserBean> call, Throwable t) { callBack.onError(new Exception("")); } }); } }
三.Presenter
1.
MyPresenter
public class MyPresenter {
private MyView myView;
private MyModel myModel;
public MyPresenter(MyView myView) {
this.myView = myView;
this.myModel = new MyModel();
}
public void get(){
myModel.getData(new ModelCallBack() {
@Override
public void onSuccess(UserBean bean) {
if(myView != null){
myView.onSuccess(bean);
}
}
@Override
public void onError(Exception e) {
if(myView != null){
myView.onError(e);
}
}
});
}
/**
* post请求数据交互
*/
public void post() {
myModel.postData(new ModelCallBack() {
@Override
public void onSuccess(UserBean bean) {
//数据交互时,为防止内存泄露,设置view层数据为空
if (myView != null){
myView.onSuccess(bean);
}
}
@Override
public void onError(Exception e) {
//数据交互时,为防止内存泄露,设置view层数据为空
if (myView != null){
myView.onError(e);
}
}
});
}
}
四.View
1.MyView
public interface MyView { public void onSuccess(UserBean bean); public void onError(Exception e); }
2.MainActivity
public class MainActivity extends AppCompatActivity implements MyView{ @BindView(R.id.recyclerView) RecyclerView recyclerView; private MyPresenter presenter; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); initData(); } private void initData() { //创建Presenter层实例,与view层交互 presenter = new MyPresenter(this); //get请求方式 presenter.get(); //设置布局管理器以及布局适配器 LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); adapter = new MyAdapter(this); recyclerView.setLayoutManager(manager); recyclerView.setAdapter(adapter); //遍历查询数据库中的所有数据 //List<UserBean> list = MyApi.session.getUserDao().loadAll(); //for (DataBean listBean : list){ // System.out.println("查询:"+listBean.toString()); //} } @Override public void onSuccess(UserBean bean) { adapter.addData(bean); } @Override public void onError(Exception e) { System.out.println("数据出错:"+e); } }
2.5 activity_main
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>
3.MyAdapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ private Context context; private List<UserBean.ResultBean.DataBean> list; public MyAdapter(Context context) { this.context = context; } //添加数据 public void addData(UserBean bean) { if (list == null) { list = new ArrayList<>(); } list.addAll(bean.getResult().getData()); notifyDataSetChanged(); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //添加布局视图 View view = View.inflate(context, R.layout.adapter, null); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.title.setText(list.get(position).getTitle()); DraweeController controller = Fresco.newDraweeControllerBuilder() .setUri(list.get(position).getThumbnail_pic_s()) .setOldController(holder.draweeView.getController())//内存优化 .setAutoPlayAnimations(true) .build(); holder.draweeView.setController(controller); } @Override public int getItemCount() { return list == null ?0:list.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ @BindView(R.id.draweeView) SimpleDraweeView draweeView; @BindView(R.id.title) TextView title; public MyViewHolder(View itemView) { super(itemView); ButterKnife.bind(this,itemView); } } }
3.5 adapter
<LinearLayout android:orientation="horizontal" android:padding="6dp" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/draweeView" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginLeft="6dp" fresco:placeholderImage="@drawable/app_default" fresco:placeholderImageScaleType="fitCenter" fresco:actualImageScaleType="focusCrop" fresco:failureImage="@drawable/load_error_image" fresco:failureImageScaleType="fitCenter" fresco:roundAsCircle="true"/> <TextView android:id="@+id/title" android:textSize="18sp" android:textStyle="bold" android:layout_marginLeft="6dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical"/> </LinearLayout>
五.权限与依赖
1.依赖
project的
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'//greenDao生产代码插件
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
Module的
apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.butterknife'
apply plugin: 'org.greenrobot.greendao'//greendao插件
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//retrofit的两个依赖
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
//eventbus的依赖
compile 'org.greenrobot:eventbus:3.1.1'
//fresco的依赖
compile 'com.facebook.fresco:fresco:1.5.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
//greendao两个依赖
compile 'org.greenrobot:greendao:3.2.2'
compile 'net.zetetic:android-database-sqlcipher:3.5.7@aar'
//recyclerview依赖
compile 'com.android.support:recyclerview-v7:25.3.1'
greendao {
schemaVersion 1
daoPackage 'com.example.lenovo.retrofit_ceshi0629.dao'//自己的包名+.dao
targetGenDir 'src/main/java'
}
//版本
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '25.2.0'
}
}
}
}
2.权限
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:name=".api.MyApi"
></application>
六.GreenDao
1.User
@Entity//必须写的
public class User {
@Id(autoincrement =true)//自增
private Long tid;//自己加的字段
}
之后Make Project就会自动创建Dao包