diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 0a70cc6..2197b5c 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -14,6 +14,7 @@
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 621fe85..99c369e 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -3,7 +3,13 @@
+
+
+
+
+
+
diff --git a/README.md b/README.md
index 06f0596..ff6e432 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
# SimpleNews
-基于Material Design和MVP的新闻客户端
+基于Material Design和MVP的新闻客户端,fork了之后我干了啥?
+* 修改部分MVP逻辑,完善可能造成内存泄露的代码。
+* 增添一个懒加载,让ViewPager+FragmentPagerAdapter的结合更加优雅。
# Screenshot
###### 新闻列表
@@ -34,4 +36,4 @@ Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
-limitations under the License.
\ No newline at end of file
+limitations under the License.
diff --git a/app/src/main/java/com/lauren/simplenews/images/presenter/ImagePresenterImpl.java b/app/src/main/java/com/lauren/simplenews/images/presenter/ImagePresenterImpl.java
index ebe261c..eecb9b7 100644
--- a/app/src/main/java/com/lauren/simplenews/images/presenter/ImagePresenterImpl.java
+++ b/app/src/main/java/com/lauren/simplenews/images/presenter/ImagePresenterImpl.java
@@ -41,4 +41,9 @@ public void onFailure(String msg, Exception e) {
mImageView.hideProgress();
mImageView.showLoadFailMsg();
}
+
+ public void onDestroy() {
+ if (mImageView != null)
+ mImageView = null;
+ }
}
diff --git a/app/src/main/java/com/lauren/simplenews/images/widget/ImageFragment.java b/app/src/main/java/com/lauren/simplenews/images/widget/ImageFragment.java
index f453b4a..22edc5a 100644
--- a/app/src/main/java/com/lauren/simplenews/images/widget/ImageFragment.java
+++ b/app/src/main/java/com/lauren/simplenews/images/widget/ImageFragment.java
@@ -56,7 +56,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
R.color.accent);
mSwipeRefreshWidget.setOnRefreshListener(this);
- mRecyclerView = (RecyclerView)view.findViewById(R.id.recycle_view);
+ mRecyclerView = (RecyclerView) view.findViewById(R.id.recycle_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity());
@@ -84,7 +84,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE
- && lastVisibleItem + 1 == mAdapter.getItemCount() ) {
+ && lastVisibleItem + 1 == mAdapter.getItemCount()) {
//加载更多
Snackbar.make(getActivity().findViewById(R.id.drawer_layout), getString(R.string.image_hit), Snackbar.LENGTH_SHORT).show();
}
@@ -93,7 +93,7 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
@Override
public void onRefresh() {
- if(mData != null) {
+ if (mData != null) {
mData.clear();
}
mImagePresenter.loadImageList();
@@ -101,7 +101,7 @@ public void onRefresh() {
@Override
public void addImages(List list) {
- if(mData == null) {
+ if (mData == null) {
mData = new ArrayList();
}
mData.addAll(list);
@@ -123,4 +123,12 @@ public void showLoadFailMsg() {
View view = getActivity() == null ? mRecyclerView.getRootView() : getActivity().findViewById(R.id.drawer_layout);
Snackbar.make(view, getString(R.string.load_fail), Snackbar.LENGTH_SHORT).show();
}
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (mImagePresenter != null)
+ ((ImagePresenterImpl) mImagePresenter).onDestroy();
+ mImagePresenter = null;
+ }
}
diff --git a/app/src/main/java/com/lauren/simplenews/main/presenter/MainPresenterImpl.java b/app/src/main/java/com/lauren/simplenews/main/presenter/MainPresenterImpl.java
index d018343..ee25a1b 100644
--- a/app/src/main/java/com/lauren/simplenews/main/presenter/MainPresenterImpl.java
+++ b/app/src/main/java/com/lauren/simplenews/main/presenter/MainPresenterImpl.java
@@ -2,6 +2,7 @@
import com.lauren.simplenews.main.view.MainView;
import com.lauren.simplenews.R;
+
/**
* Description :
* Author : lauren
@@ -37,4 +38,9 @@ public void switchNavigation(int id) {
break;
}
}
+
+ public void onDestroy() {
+ if (mMainView != null)
+ mMainView = null;
+ }
}
diff --git a/app/src/main/java/com/lauren/simplenews/main/widget/MainActivity.java b/app/src/main/java/com/lauren/simplenews/main/widget/MainActivity.java
index e316743..a394df5 100644
--- a/app/src/main/java/com/lauren/simplenews/main/widget/MainActivity.java
+++ b/app/src/main/java/com/lauren/simplenews/main/widget/MainActivity.java
@@ -110,4 +110,13 @@ public void switch2About() {
getSupportFragmentManager().beginTransaction().replace(R.id.frame_content, new AboutFragment()).commit();
mToolbar.setTitle(R.string.navigation_about);
}
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mMainPresenter != null)
+ ((MainPresenterImpl) mMainPresenter).onDestroy();
+ mMainPresenter = null;
+ }
+
}
diff --git a/app/src/main/java/com/lauren/simplenews/news/presenter/NewsDetailPresenterImpl.java b/app/src/main/java/com/lauren/simplenews/news/presenter/NewsDetailPresenterImpl.java
index cabfd7d..3a4e9b0 100644
--- a/app/src/main/java/com/lauren/simplenews/news/presenter/NewsDetailPresenterImpl.java
+++ b/app/src/main/java/com/lauren/simplenews/news/presenter/NewsDetailPresenterImpl.java
@@ -35,7 +35,7 @@ public void loadNewsDetail(final String docId) {
@Override
public void onSuccess(NewsDetailBean newsDetailBean) {
- if(newsDetailBean != null) {
+ if (newsDetailBean != null) {
mNewsDetailView.showNewsDetialContent(newsDetailBean.getBody());
}
mNewsDetailView.hideProgress();
@@ -45,4 +45,9 @@ public void onSuccess(NewsDetailBean newsDetailBean) {
public void onFailure(String msg, Exception e) {
mNewsDetailView.hideProgress();
}
+
+ public void onDestroy() {
+ if (mNewsDetailView != null)
+ mNewsDetailView = null;
+ }
}
diff --git a/app/src/main/java/com/lauren/simplenews/news/presenter/NewsPresenterImpl.java b/app/src/main/java/com/lauren/simplenews/news/presenter/NewsPresenterImpl.java
index f895e12..23de594 100644
--- a/app/src/main/java/com/lauren/simplenews/news/presenter/NewsPresenterImpl.java
+++ b/app/src/main/java/com/lauren/simplenews/news/presenter/NewsPresenterImpl.java
@@ -82,4 +82,9 @@ public void onFailure(String msg, Exception e) {
mNewsView.hideProgress();
mNewsView.showLoadFailMsg();
}
+
+ public void onDestroy(){
+ if(mNewsView != null)
+ mNewsView = null;
+ }
}
diff --git a/app/src/main/java/com/lauren/simplenews/news/widget/BaseLazyFragment.java b/app/src/main/java/com/lauren/simplenews/news/widget/BaseLazyFragment.java
new file mode 100644
index 0000000..34ba227
--- /dev/null
+++ b/app/src/main/java/com/lauren/simplenews/news/widget/BaseLazyFragment.java
@@ -0,0 +1,107 @@
+package com.lauren.simplenews.news.widget;
+
+import android.content.Context;
+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;
+
+
+/**
+ * Created by Luo_xiasuhuei321@163.com on 2016/8/29.
+ *
+ * 实现懒加载的Fragment
+ */
+public abstract class BaseLazyFragment extends Fragment {
+
+ protected View mRootView;
+ protected Context mContext;
+ protected boolean isVisible;
+ private boolean isPrepared;
+ private boolean isFirst = true;
+
+ //--------------------system method callback------------------------//
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ isPrepared = true;
+ initPrepare();
+ }
+
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ super.setUserVisibleHint(isVisibleToUser);
+ if(getUserVisibleHint()){
+ isVisible = true;
+ lazyLoad();
+ }else{
+ isVisible = false;
+ onInvisible();
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if(getUserVisibleHint()){
+ setUserVisibleHint(true);
+ }
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mContext = getActivity();
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ if(mRootView == null){
+ mRootView = initView(inflater,container,savedInstanceState);
+ }
+
+ return mRootView;
+ }
+
+ //--------------------------------method---------------------------//
+
+ /**
+ * 懒加载
+ */
+ protected void lazyLoad(){
+ if(!isPrepared || !isVisible || !isFirst){
+ return;
+ }
+ initData();
+ isFirst = false;
+ }
+
+ //--------------------------abstract method------------------------//
+
+ /**
+ * 在onActivityCreated中调用的方法,可以用来进行初始化操作。
+ */
+ protected abstract void initPrepare();
+
+ /**
+ * fragment被设置为不可见时调用
+ */
+ protected abstract void onInvisible();
+
+ /**
+ * 这里获取数据,刷新界面
+ */
+ protected abstract void initData();
+
+ /**
+ * 初始化布局,请不要把耗时操作放在这个方法里,这个方法用来提供一个
+ * 基本的布局而非一个完整的布局,以免ViewPager预加载消耗大量的资源。
+ */
+ protected abstract View initView(LayoutInflater inflater,
+ @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState);
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lauren/simplenews/news/widget/NewsDetailActivity.java b/app/src/main/java/com/lauren/simplenews/news/widget/NewsDetailActivity.java
index b6ec6fe..e094ebe 100644
--- a/app/src/main/java/com/lauren/simplenews/news/widget/NewsDetailActivity.java
+++ b/app/src/main/java/com/lauren/simplenews/news/widget/NewsDetailActivity.java
@@ -81,4 +81,12 @@ public void showProgress() {
public void hideProgress() {
mProgressBar.setVisibility(View.GONE);
}
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if(mNewsDetailPresenter != null)
+ ((NewsDetailPresenterImpl)mNewsDetailPresenter).onDestroy();
+ mNewsDetailPresenter = null;
+ }
}
diff --git a/app/src/main/java/com/lauren/simplenews/news/widget/NewsListFragment.java b/app/src/main/java/com/lauren/simplenews/news/widget/NewsListFragment.java
index 7e80958..7117825 100644
--- a/app/src/main/java/com/lauren/simplenews/news/widget/NewsListFragment.java
+++ b/app/src/main/java/com/lauren/simplenews/news/widget/NewsListFragment.java
@@ -6,7 +6,6 @@
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
@@ -28,14 +27,14 @@
import java.util.List;
/**
- * Description : 新闻Fragment
- * Author : lauren
- * Email : lauren.liuling@gmail.com
- * Blog : http://www.liuling123.com
- * Date : 15/12/13
+ * - * Description : 新闻Fragment
+ * - * Author : lauren
+ * - * Email : lauren.liuling@gmail.com
+ * - * Blog : http://www.liuling123.com
+ * - * Date : 15/12/13
+ * + * Created by Administrator on 2016/9/1.
*/
-public class NewsListFragment extends Fragment implements NewsView, SwipeRefreshLayout.OnRefreshListener {
-
+public class NewsListFragment extends BaseLazyFragment implements NewsView, SwipeRefreshLayout.OnRefreshListener {
private static final String TAG = "NewsListFragment";
private SwipeRefreshLayout mSwipeRefreshWidget;
@@ -48,24 +47,28 @@ public class NewsListFragment extends Fragment implements NewsView, SwipeRefresh
private int mType = NewsFragment.NEWS_TYPE_TOP;
private int pageIndex = 0;
- public static NewsListFragment newInstance(int type) {
- Bundle args = new Bundle();
- NewsListFragment fragment = new NewsListFragment();
- args.putInt("type", type);
- fragment.setArguments(args);
- return fragment;
- }
+
+ //---------------------abstract method------------------------//
@Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ protected void initPrepare() {
mNewsPresenter = new NewsPresenterImpl(this);
mType = getArguments().getInt("type");
}
- @Nullable
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ protected void onInvisible() {
+
+ }
+
+ @Override
+ protected void initData() {
+ onRefresh();
+// mNewsPresenter.loadNews(mType, pageIndex + Urls.PAZE_SIZE);
+ }
+
+ @Override
+ protected View initView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_newslist, null);
mSwipeRefreshWidget = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_widget);
@@ -74,7 +77,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
R.color.accent);
mSwipeRefreshWidget.setOnRefreshListener(this);
- mRecyclerView = (RecyclerView)view.findViewById(R.id.recycle_view);
+ mRecyclerView = (RecyclerView) view.findViewById(R.id.recycle_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity());
@@ -85,10 +88,20 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
mAdapter.setOnItemClickListener(mOnItemClickListener);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addOnScrollListener(mOnScrollListener);
- onRefresh();
return view;
}
+
+ public static NewsListFragment newInstance(int type) {
+ Bundle args = new Bundle();
+ NewsListFragment fragment = new NewsListFragment();
+ args.putInt("type", type);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ //-----------------------------call back----------------------------------//
+
private RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {
private int lastVisibleItem;
@@ -136,15 +149,15 @@ public void showProgress() {
@Override
public void addNews(List newsList) {
mAdapter.isShowFooter(true);
- if(mData == null) {
+ if (mData == null) {
mData = new ArrayList();
}
mData.addAll(newsList);
- if(pageIndex == 0) {
+ if (pageIndex == 0) {
mAdapter.setmDate(mData);
} else {
//如果没有更多数据了,则隐藏footer布局
- if(newsList == null || newsList.size() == 0) {
+ if (newsList == null || newsList.size() == 0) {
mAdapter.isShowFooter(false);
}
mAdapter.notifyDataSetChanged();
@@ -160,7 +173,7 @@ public void hideProgress() {
@Override
public void showLoadFailMsg() {
- if(pageIndex == 0) {
+ if (pageIndex == 0) {
mAdapter.isShowFooter(false);
mAdapter.notifyDataSetChanged();
}
@@ -171,10 +184,17 @@ public void showLoadFailMsg() {
@Override
public void onRefresh() {
pageIndex = 0;
- if(mData != null) {
+ if (mData != null) {
mData.clear();
}
mNewsPresenter.loadNews(mType, pageIndex);
}
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (mNewsPresenter != null)
+ ((NewsPresenterImpl) mNewsPresenter).onDestroy();
+ mNewsPresenter = null;
+ }
}
diff --git a/app/src/main/java/com/lauren/simplenews/weather/widget/WeatherFragment.java b/app/src/main/java/com/lauren/simplenews/weather/widget/WeatherFragment.java
index d064c92..08e9314 100644
--- a/app/src/main/java/com/lauren/simplenews/weather/widget/WeatherFragment.java
+++ b/app/src/main/java/com/lauren/simplenews/weather/widget/WeatherFragment.java
@@ -135,4 +135,10 @@ public void setWeatherData(List lists) {
public void showErrorToast(String msg) {
Snackbar.make(getActivity().findViewById(R.id.drawer_layout), msg, Snackbar.LENGTH_SHORT).show();
}
+
+ @Override
+ public void onDestroy() {
+ mWeatherPresenter = null;
+ super.onDestroy();
+ }
}