先对GreenDao进行配置
最外层也就是你的工程的build.gradle加上这行代码
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin然后就是你的项目就的依赖最上方加
apply plugin: 'org.greenrobot.greendao'然后在buildTypes方法体下加
greendao { schemaVersion 1 targetGenDir 'src/main/java' //路径 daoPackage 'com.example.greendao.dao'//生成数据库的包 }这是它的依赖
compile 'org.greenrobot:greendao:3.2.0'
主MainActivity
public class MainActivity extends AppCompatActivity implements MainView{ @BindView(R.id.rcv) RecyclerView rcv; //RecyLerView MainPrenter mainPrenter; //p层的 实体类 MainApdata mainApdata; //适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); mainPrenter = new MainPrenter(this); mainPrenter.post();//这里是post请求 这两个请求只可以存在一个 //mainPrenter.get();//这里是get请求 List<DataBean> list = App.daoSession.getDataBeanDao().loadAll(); for (DataBean beans : list){ System.out.println(beans.toString()); Log.e("========",beans.toString()); } } //成功 @Override public void Suucer(NewsBean bean) { //布局管理器 LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); mainApdata = new MainApdata(this,bean); //设置布局管理器 rcv.setLayoutManager(manager); //绑定适配器 rcv.setAdapter(mainApdata); } //失败 @Override public void Derch(Exception e) { } //内存泄漏 @Override protected void onDestroy() { super.onDestroy(); //解绑 mainPrenter.data(); } }主布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.greendao.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/rcv" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout>View层
public interface MainView { void Suucer(NewsBean bean); //成功 void Derch(Exception e);//失败 }这是为网络请求做的接口
//这里是用的Retrofit做的网络请求 public interface IGetDataBase { //http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653 //这是GET请求 上面那是我的请求用的网址 可以观看一下 @GET("/toutiao/index") Call<NewsBean> get(@Query("key")String key); //这是POST请求 @POST("/toutiao/index") Call<NewsBean> post(@Field("key")String Key); }
Prenter层
public class MainPrenter { //WeakReference弱引用 public WeakReference<MainView> mainView; private MainModle mainModle; //modle层的实体类 public MainPrenter(MainView mainView) { datach(mainView); this.mainModle = new MainModle(); } //get请求 public void get(){ //这里用modle层的实体类点它的方法 来new出来Modle的接口 mainModle.getData(new MainMoldleInie() { //成功的方法 @Override public void Suucer(NewsBean bean) { //判断如果View层的对象不为空,就把数据给view层的对象 if (mainView!=null){ //赋值 mainView.get().Suucer(bean); } } //失败的方法 @Override public void Derch(Exception e) { // 因为呦内存泄漏问题 ,所以在失败的方法里也要用非空判断 if (mainView!=null){ //赋值 mainView.get().Derch(e); } } }); } //这是Post请求 public void post(){ mainModle.getData(new MainMoldleInie() { @Override public void Suucer(NewsBean bean) { if (mainView!=null){ mainView.get().Suucer(bean); } } @Override public void Derch(Exception e) { if (mainView!=null){ mainView.get().Derch(e); } } }); } // 绑定 内存泄漏 public void datach(MainView view){ mainView = new WeakReference(view); } //解绑 public void data(){ mainView.clear(); } }Modle层的接口
public interface MainMoldleInie { void Suucer(NewsBean bean); //成功 void Derch(Exception e);//失败 }Modle层的类
public class MainModle { //Modle层 自己定义的GET请求的方法 public void getData(final MainMoldleInie moldleInie){ //这是网络请求 用的是Modle层的接口 调用的事get请求 597b4f9dcb50e051fd725a9ec54d6653这是请求体的key Call<NewsBean> call = App.iGetDataBase.get("597b4f9dcb50e051fd725a9ec54d6653"); //这里是异步请求 效率高 重写了两个方法 一个成功 一个失败 call.enqueue(new Callback<NewsBean>() { //成功的方法 成功了就把NewsBean的对象传过去 @Override public void onResponse(Call<NewsBean> call, Response<NewsBean> response) { NewsBean bean = response.body(); moldleInie.Suucer(bean); //这是向数据库插入数据的操作 App.daoSession.getDataBeanDao().insertInTx(bean.getResult().getData()); } //失败了就传空 @Override public void onFailure(Call<NewsBean> call, Throwable t) { moldleInie.Derch(new Exception("")); } }); } //这是post请求 原理同上 public void postData( final MainMoldleInie moldleInie){ Call<NewsBean> call = App.iGetDataBase.post("88f7bbc507e3ecacfaeab2b47dd8936f"); call.enqueue(new Callback<NewsBean>() { @Override public void onResponse(Call<NewsBean> call, Response<NewsBean> response) { NewsBean bean = response.body(); moldleInie.Suucer(bean); App.daoSession.getDataBeanDao().insertInTx(bean.getResult().getData()); } @Override public void onFailure(Call<NewsBean> call, Throwable t) { moldleInie.Derch(new Exception("")); } }); } }这是适配器
public class MainApdata extends RecyclerView.Adapter<MainApdata.ViewHolder> { Context context; //上下文 NewsBean listBeans; //集合 public MainApdata(Context context,NewsBean listBeans) { this.context = context; this.listBeans = listBeans; } //加载布局 @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.layout, null); return new ViewHolder(view); } //赋值 给参数 @Override public void onBindViewHolder(ViewHolder holder, final int position) { holder.sdv.setImageURI(listBeans.getResult().getData().get(position).getThumbnail_pic_s()); holder.tv.setText(listBeans.getResult().getData().get(position).getTitle()); holder.tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { context.startActivity(new Intent(context, Main2Activity.class)); EventBus.getDefault().postSticky(new EventBean("123",listBeans.getResult().getData().get(position).getTitle())); } }); } @Override public int getItemCount() { return listBeans.getResult().getData().size();//三元运算符 } //找控件 public class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.sdv) SimpleDraweeView sdv; @BindView(R.id.tv) TextView tv; public ViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } }适配器用到的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/sdv" android:layout_width="130dp" android:layout_height="110dp" android:layout_marginLeft="10dp" /> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:layout_marginLeft="10dp" android:text="123" /> </LinearLayout>这是App用于初始化需要在清单文件注册
public class App extends Application { public static IGetDataBase iGetDataBase; //这是定义的网络请求接口 public static DaoSession daoSession; //这是自动生成的Dao里的文件 它是打开数据库 @Override public void onCreate() { super.onCreate(); //Retrofit网络请求 这里放的是请求头 因为这里是初始化 数据先走这里 http://v.juhe.cn请求头 Retrofit retrofit = new Retrofit.Builder().baseUrl("http://v.juhe.cn") .addConverterFactory(GsonConverterFactory.create()) .build(); iGetDataBase= retrofit.create(IGetDataBase.class); DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"test"); SQLiteDatabase database = helper.getWritableDatabase(); daoSession= new DaoMaster(database).newSession(); //Fresco图片加载的框架 初始化 Fresco.initialize(this); } }这是 跳转后的页面 EventBus接收数据
public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); EventBus.getDefault().register(this); } @Subscribe(sticky = true) public void even(EventBean eventBus){ Toast.makeText(this, ""+ eventBus.getUrl() + "" + eventBus.getTitle(), Toast.LENGTH_SHORT).show(); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }EventBus的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.greendao.Main2Activity"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="123" /> </LinearLayout>