Browse Source

Refactor: Refactor CourseRepository. Singleton Pattern. Refactor HomeViewModel, use repository.

kenny67nju 5 years ago
parent
commit
b9eed0f981

+ 2 - 2
app/src/main/java/cn/seecoder/courselearningdemo/network/CourseOrderService.java → app/src/main/java/cn/seecoder/courselearningdemo/dao/CourseOrderDao.java

@@ -1,4 +1,4 @@
-package cn.seecoder.courselearningdemo.network;
+package cn.seecoder.courselearningdemo.dao;
 
 import java.util.List;
 
@@ -10,7 +10,7 @@ import retrofit2.http.GET;
 import retrofit2.http.POST;
 import retrofit2.http.Path;
 
-public interface CourseOrderService {
+public interface CourseOrderDao {
     /**
      * 创建购买课程的订单
      */

+ 9 - 1
app/src/main/java/cn/seecoder/courselearningdemo/network/RetrofitClient.java

@@ -1,6 +1,7 @@
 package cn.seecoder.courselearningdemo.network;
 
 import cn.seecoder.courselearningdemo.dao.CourseDao;
+import cn.seecoder.courselearningdemo.dao.CourseOrderDao;
 import cn.seecoder.courselearningdemo.dao.CourseWareDao;
 import cn.seecoder.courselearningdemo.utils.Constant;
 import retrofit2.Retrofit;
@@ -13,7 +14,14 @@ public class RetrofitClient {
             .build();
     public static CourseDao courseDao = retrofit.create(CourseDao.class);
     public static CourseWareDao courseWareDao = retrofit.create(CourseWareDao.class);
-    public static CourseOrderService courseOrderService = retrofit.create(CourseOrderService.class);
+    public static CourseOrderDao courseOrderDao = retrofit.create(CourseOrderDao.class);
     public static UserService userService = retrofit.create(UserService.class);
     public static NotifyService notifyService = retrofit.create(NotifyService.class);
+
+    public static CourseDao getCourseDao(){return courseDao;}
+    public static CourseWareDao getCourseWareDao(){return courseWareDao;}
+    public static CourseOrderDao getCourseOrderDao(){return courseOrderDao;}
+//    public static UserDao getUserDao(){return userDao;}
+//    public static NotifyDao getNotifyDao(){return notifyDao;}
+
 }

+ 51 - 0
app/src/main/java/cn/seecoder/courselearningdemo/repository/CourseOrderRepository.java

@@ -0,0 +1,51 @@
+package cn.seecoder.courselearningdemo.repository;
+
+import androidx.lifecycle.MutableLiveData;
+
+import cn.seecoder.courselearningdemo.dao.CourseOrderDao;
+import cn.seecoder.courselearningdemo.model.CourseOrder;
+import cn.seecoder.courselearningdemo.model.ResultVO;
+import cn.seecoder.courselearningdemo.network.RetrofitClient;
+import cn.seecoder.courselearningdemo.utils.Constant;
+import cn.seecoder.courselearningdemo.utils.LogUtil;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+import retrofit2.http.Body;
+
+public class CourseOrderRepository {
+    private final MutableLiveData<Boolean> courseOrderFlag = new MutableLiveData<>();
+    private CourseOrderDao courseOrderDao=RetrofitClient.getCourseOrderDao();
+    private boolean successCreatedFlag;
+
+    public MutableLiveData<Boolean> createCourseOrder(CourseOrder order)
+    {
+
+        // 调用后端生成订单的接口
+        Call<ResultVO<CourseOrder>> courseOrderCall = courseOrderDao.createCourseOrder(order);
+        courseOrderCall.enqueue(new Callback<ResultVO<CourseOrder>>() {
+            @Override
+            public void onResponse(Call<ResultVO<CourseOrder>> call, Response<ResultVO<CourseOrder>> response) {
+                if(response.body() == null || response.body().getCode() == null)
+                    LogUtil.e("createCourseOrder", "response Null Error!");
+                else if(response.body().getCode().equals(Constant.REQUEST_SUCCESS)){
+                    successCreatedFlag = true;
+                    courseOrderFlag.setValue(true);
+                }else {
+                    courseOrderFlag.setValue(false);
+                    LogUtil.e("createCourseOrder", response.body().getMsg());
+                }
+            }
+
+            @Override
+            public void onFailure(Call<ResultVO<CourseOrder>> call, Throwable t) {
+                LogUtil.e("createCourseOrder Fail", t.getMessage());
+            }
+        });
+
+        return courseOrderFlag;
+    }
+    public boolean getSuccessCreatedFlag(){
+        return successCreatedFlag;
+    }
+}

+ 54 - 8
app/src/main/java/cn/seecoder/courselearningdemo/repository/CourseRepository.java

@@ -2,37 +2,48 @@ package cn.seecoder.courselearningdemo.repository;
 
 import androidx.lifecycle.MutableLiveData;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import cn.seecoder.courselearningdemo.dao.CourseDao;
 import cn.seecoder.courselearningdemo.dao.UserDao;
 import cn.seecoder.courselearningdemo.model.Course;
 import cn.seecoder.courselearningdemo.model.CourseWare;
+import cn.seecoder.courselearningdemo.model.PageInfo;
 import cn.seecoder.courselearningdemo.model.User;
 import cn.seecoder.courselearningdemo.network.RetrofitClient;
+import cn.seecoder.courselearningdemo.utils.LoadState;
 import cn.seecoder.courselearningdemo.utils.LogUtil;
 import cn.seecoder.courselearningdemo.utils.ToastUtil;
 import retrofit2.Call;
 import retrofit2.Callback;
 import retrofit2.Response;
+import retrofit2.http.Path;
+import retrofit2.http.Query;
 
 public class CourseRepository {
     private CourseDao courseDao = RetrofitClient.courseDao;
     private final MutableLiveData<Course> courseData = new MutableLiveData<>();
-    private final MutableLiveData<List<CourseWare>> courseWareData = new MutableLiveData<>();
+    private static CourseRepository uniqueInstance = null;
+    private Integer currentPage = 1;
 
-
-    public CourseRepository(Course course, Integer courseId){
-        loadCourse(courseId);
+    public static CourseRepository getCourseRepository(){
+        if (uniqueInstance == null)
+        {
+            uniqueInstance = new CourseRepository();
+        }
+        return uniqueInstance;
     }
 
-
-    public MutableLiveData<Course> getCourseData(){
-        return courseData;
+    private CourseRepository(){
 
     }
+    public Integer getCurrentPage(){
+        return currentPage;
+    }
+
 
-    private void loadCourse(Integer courseId){
+    public MutableLiveData<Course> getCourseData(Integer courseId){
         String uid = null;
         User user = UserDao.getUser();
         if(user!=null && user.getUid()!=null)
@@ -55,8 +66,43 @@ public class CourseRepository {
                 ToastUtil.showShortToast("网络错误,请稍后重试!");
             }
         });
+        return courseData;
+
+    }
+    public void getCourseListData(Integer currentPageNum, String uid,String queryKey,MutableLiveData<List<Course>> courseListData,MutableLiveData<LoadState> stateData){
+        stateData.setValue(LoadState.LOADING);
+        Call<PageInfo<Course>> courseCall =  courseDao.getAllCourses(currentPageNum, uid, queryKey);
+        // 异步调用
+        courseCall.enqueue(new Callback<PageInfo<Course>>() {
+            @Override
+            public void onResponse(Call<PageInfo<Course>> call, Response<PageInfo<Course>> response) {
+                LogUtil.i(courseCall, "Get response");
+                if (response.body() == null){
+                    stateData.setValue(LoadState.ERROR);
+                    currentPage--;
+                } else if (response.body().getSize() == 0 || currentPage > response.body().getPages() ){
+                    stateData.setValue(LoadState.EMPTY);
+                    currentPage--;
+                } else {
+                    stateData.setValue(LoadState.SUCCESS);
+                    List<Course> temp = (courseListData.getValue() != null) ? courseListData.getValue() : new ArrayList<>();
+                    temp.addAll(response.body().getList());
+                    courseListData.setValue(temp);
+                }
+            }
+
+            @Override
+            public void onFailure(Call<PageInfo<Course>> call, Throwable t) {
+                LogUtil.e(courseCall, "loadCourseListPageInfo failure: "+ t.getMessage() + "  caused by: "+t.getCause());
+                stateData.setValue(LoadState.ERROR);
+                currentPage--;
+            }
+        });
+
+
     }
 
 
 
+
 }

+ 2 - 3
app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/CourseViewModel.java

@@ -22,7 +22,7 @@ import retrofit2.Response;
 public class CourseViewModel extends ViewModel {
     private MutableLiveData<Course> courseData ;
     private MutableLiveData<List<CourseWare>> courseWareData ;
-    private CourseRepository courseRepository;
+    private CourseRepository courseRepository=CourseRepository.getCourseRepository();
     private CourseWareRepository courseWareRepository;
     private Course course;
 
@@ -33,8 +33,7 @@ public class CourseViewModel extends ViewModel {
         loadCourse(course.getId());
     }
     public void loadCourse(Integer courseId){
-        courseRepository = new CourseRepository(course,courseId);
-        courseData = courseRepository.getCourseData();
+        courseData = courseRepository.getCourseData(courseId);
 
         courseWareRepository = new CourseWareRepository(course,courseId);
         courseWareData = courseWareRepository.getCourseWareData();

+ 19 - 54
app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/HomeViewModel.java

@@ -8,15 +8,17 @@ import java.util.ArrayList;
 import java.util.List;
 
 import cn.seecoder.courselearningdemo.model.CourseOrder;
+import cn.seecoder.courselearningdemo.model.PageInfo;
 import cn.seecoder.courselearningdemo.model.ResultVO;
 
 
+import cn.seecoder.courselearningdemo.repository.CourseOrderRepository;
+import cn.seecoder.courselearningdemo.repository.CourseRepository;
 import cn.seecoder.courselearningdemo.utils.Constant;
 import retrofit2.Call;
 import retrofit2.Callback;
 import retrofit2.Response;
 import cn.seecoder.courselearningdemo.model.Course;
-import cn.seecoder.courselearningdemo.model.PageInfo;
 import cn.seecoder.courselearningdemo.network.RetrofitClient;
 import cn.seecoder.courselearningdemo.utils.LoadState;
 import cn.seecoder.courselearningdemo.utils.LogUtil;
@@ -26,9 +28,14 @@ public class HomeViewModel extends ViewModel {
     private String queryKey = "";
     private Integer currentPage = 1;
     private MutableLiveData<LoadState> stateData;
-    private MutableLiveData<List<Course>> courseData;
-    private final MutableLiveData<Boolean> courseOrderFlag = new MutableLiveData<>();
+    private MutableLiveData<List<Course>> courseListData;
+    private MutableLiveData<Boolean> courseOrderFlag = new MutableLiveData<>();
+    private CourseOrderRepository courseOrderRepository= new CourseOrderRepository();
+    private CourseRepository courseRepository= CourseRepository.getCourseRepository();
 
+    public HomeViewModel(){
+
+    }
 
     public void setUid(String uid) {
         this.uid = uid;
@@ -48,12 +55,12 @@ public class HomeViewModel extends ViewModel {
     }
 
     public LiveData<List<Course>> getData() {
-        if (courseData == null) {
-            courseData = new MutableLiveData<>();
+        if (courseListData == null) {
+            courseListData = new MutableLiveData<>();
             stateData = new MutableLiveData<>();
             loadData();
         }
-        return courseData;
+        return courseListData;
     }
 
     public LiveData<Boolean> getCourseOrderFlag(){
@@ -66,39 +73,14 @@ public class HomeViewModel extends ViewModel {
 
     public void query(){
         currentPage = 1;
-        courseData.setValue(new ArrayList<>());
+        courseListData.setValue(new ArrayList<>());
         loadData();
     }
 
     private void loadData(){
         stateData.setValue(LoadState.LOADING);
-        Call<PageInfo<Course>> courseCall =  RetrofitClient.courseDao.getAllCourses(currentPage, uid, queryKey);
-        // 异步调用
-        courseCall.enqueue(new Callback<PageInfo<Course>>() {
-            @Override
-            public void onResponse(Call<PageInfo<Course>> call, Response<PageInfo<Course>> response) {
-                LogUtil.i(courseCall, "Get response");
-                if (response.body() == null){
-                    stateData.setValue(LoadState.ERROR);
-                    currentPage --;
-                } else if (response.body().getSize() == 0 || currentPage > response.body().getPages() ){
-                    stateData.setValue(LoadState.EMPTY);
-                    currentPage --;
-                } else {
-                    stateData.setValue(LoadState.SUCCESS);
-                    List<Course> temp = (courseData.getValue() != null) ? courseData.getValue() : new ArrayList<>();
-                    temp.addAll(response.body().getList());
-                    courseData.setValue(temp);
-                }
-            }
-
-            @Override
-            public void onFailure(Call<PageInfo<Course>> call, Throwable t) {
-                LogUtil.e(courseCall, "loadCourseListPageInfo failure: "+ t.getMessage() + "  caused by: "+t.getCause());
-                stateData.setValue(LoadState.ERROR);
-                currentPage --;
-            }
-        });
+        courseRepository.getCourseListData(currentPage,uid,queryKey,courseListData,stateData);
+        currentPage =courseRepository.getCurrentPage();
     }
 
     public void createCourseOrder(Course course){
@@ -111,26 +93,9 @@ public class HomeViewModel extends ViewModel {
         // 订单状态设为未支付
         order.setStatus(Constant.ORDER_STATUS_UNPAID);
         // 调用后端生成订单的接口
-        Call<ResultVO<CourseOrder>> courseOrderCall = RetrofitClient.courseOrderService.createCourseOrder(order);
-        courseOrderCall.enqueue(new Callback<ResultVO<CourseOrder>>() {
-            @Override
-            public void onResponse(Call<ResultVO<CourseOrder>> call, Response<ResultVO<CourseOrder>> response) {
-                if(response.body() == null || response.body().getCode() == null)
-                    LogUtil.e("createCourseOrder", "response Null Error!");
-                else if(response.body().getCode().equals(Constant.REQUEST_SUCCESS)){
-                    courseOrderFlag.setValue(true);
-                    sendCourseOrderSuccessNotify(course.getId());
-                }else {
-                    courseOrderFlag.setValue(false);
-                    LogUtil.e("createCourseOrder", response.body().getMsg());
-                }
-            }
-
-            @Override
-            public void onFailure(Call<ResultVO<CourseOrder>> call, Throwable t) {
-                LogUtil.e("createCourseOrder Fail", t.getMessage());
-            }
-        });
+        courseOrderFlag=courseOrderRepository.createCourseOrder(order);
+        if(courseOrderRepository.getSuccessCreatedFlag()==true)
+            sendCourseOrderSuccessNotify(course.getId());
     }
 
     private void sendCourseOrderSuccessNotify(Integer courseId){