From ba437ed0d5c6ace6851d9a7695b8d8aad85c5a46 Mon Sep 17 00:00:00 2001 From: luo_xiasuhuei321 Date: Thu, 1 Sep 2016 13:45:46 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A2=9E=E6=B7=BB=E6=87=92=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 7 ++ .idea/modules.xml | 3 + .../images/widget/ImageFragment.java | 6 + .../simplenews/main/widget/MainActivity.java | 6 + .../news/widget/BaseLazyFragment.java | 107 ++++++++++++++++++ .../news/widget/NewsDetailActivity.java | 6 + .../news/widget/NewsListFragment.java | 53 +++++---- .../weather/widget/WeatherFragment.java | 6 + 8 files changed, 174 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/com/lauren/simplenews/news/widget/BaseLazyFragment.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 0a70cc6..7f7d4dd 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -14,6 +14,13 @@ + diff --git a/.idea/modules.xml b/.idea/modules.xml index 621fe85..48f7935 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,8 +3,11 @@ + + + \ No newline at end of file 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..a6a4e08 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 @@ -123,4 +123,10 @@ 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() { + mImagePresenter = null; + super.onDestroy(); + } } 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..ebb5040 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,10 @@ public void switch2About() { getSupportFragmentManager().beginTransaction().replace(R.id.frame_content, new AboutFragment()).commit(); mToolbar.setTitle(R.string.navigation_about); } + + @Override + protected void onDestroy() { + mMainPresenter = null; + super.onDestroy(); + } } 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..1bab667 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,10 @@ public void showProgress() { public void hideProgress() { mProgressBar.setVisibility(View.GONE); } + + @Override + protected void onDestroy() { + mNewsDetailPresenter = null; + super.onDestroy(); + } } 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..0b15ae4 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,9 @@ import java.util.List; /** - * 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 +42,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); @@ -85,10 +83,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; @@ -177,4 +185,9 @@ public void onRefresh() { mNewsPresenter.loadNews(mType, pageIndex); } + @Override + public void onDestroy() { + mNewsPresenter = null; + super.onDestroy(); + } } 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(); + } } From a0b4b5205ae1c14876b1e659a78cffc9ecfac5b0 Mon Sep 17 00:00:00 2001 From: ForgetAll Date: Thu, 1 Sep 2016 16:21:57 +0800 Subject: [PATCH 2/4] Update NewsListFragment.java --- .../simplenews/news/widget/NewsListFragment.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) 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 0b15ae4..b77a7f6 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 @@ -26,9 +26,14 @@ import java.util.ArrayList; import java.util.List; -/** - * Created by Administrator on 2016/9/1. - */ + /** +- * 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 BaseLazyFragment implements NewsView,SwipeRefreshLayout.OnRefreshListener{ private static final String TAG = "NewsListFragment"; From bad1e1bdad110b1c3d168305766208cc48d565f6 Mon Sep 17 00:00:00 2001 From: luo Date: Sun, 16 Oct 2016 19:27:17 +0800 Subject: [PATCH 3/4] last commit --- .idea/gradle.xml | 8 +---- .idea/modules.xml | 3 ++ .../images/presenter/ImagePresenterImpl.java | 5 +++ .../images/widget/ImageFragment.java | 12 ++++--- .../main/presenter/MainPresenterImpl.java | 6 ++++ .../simplenews/main/widget/MainActivity.java | 5 ++- .../presenter/NewsDetailPresenterImpl.java | 7 +++- .../news/presenter/NewsPresenterImpl.java | 5 +++ .../news/widget/NewsDetailActivity.java | 4 ++- .../news/widget/NewsListFragment.java | 34 ++++++++++--------- 10 files changed, 58 insertions(+), 31 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7f7d4dd..2197b5c 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -14,13 +14,7 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml index 48f7935..99c369e 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,10 +4,13 @@ + + + \ No newline at end of file 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 a6a4e08..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); @@ -126,7 +126,9 @@ public void showLoadFailMsg() { @Override public void onDestroy() { - mImagePresenter = null; 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 ebb5040..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 @@ -113,7 +113,10 @@ public void switch2About() { @Override protected void onDestroy() { - mMainPresenter = null; 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/NewsDetailActivity.java b/app/src/main/java/com/lauren/simplenews/news/widget/NewsDetailActivity.java index 1bab667..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 @@ -84,7 +84,9 @@ public void hideProgress() { @Override protected void onDestroy() { - mNewsDetailPresenter = null; 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 b77a7f6..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 @@ -26,15 +26,15 @@ import java.util.ArrayList; import java.util.List; - /** -- * 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 BaseLazyFragment implements NewsView,SwipeRefreshLayout.OnRefreshListener{ +/** + * - * 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 BaseLazyFragment implements NewsView, SwipeRefreshLayout.OnRefreshListener { private static final String TAG = "NewsListFragment"; private SwipeRefreshLayout mSwipeRefreshWidget; @@ -77,7 +77,7 @@ protected View initView(LayoutInflater inflater, @Nullable ViewGroup container, 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()); @@ -149,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(); @@ -173,7 +173,7 @@ public void hideProgress() { @Override public void showLoadFailMsg() { - if(pageIndex == 0) { + if (pageIndex == 0) { mAdapter.isShowFooter(false); mAdapter.notifyDataSetChanged(); } @@ -184,7 +184,7 @@ public void showLoadFailMsg() { @Override public void onRefresh() { pageIndex = 0; - if(mData != null) { + if (mData != null) { mData.clear(); } mNewsPresenter.loadNews(mType, pageIndex); @@ -192,7 +192,9 @@ public void onRefresh() { @Override public void onDestroy() { - mNewsPresenter = null; super.onDestroy(); + if (mNewsPresenter != null) + ((NewsPresenterImpl) mNewsPresenter).onDestroy(); + mNewsPresenter = null; } } From 18ff627897206ab1eef8da076be838b24c3d1295 Mon Sep 17 00:00:00 2001 From: ForgetAll Date: Tue, 15 Nov 2016 09:52:13 +0800 Subject: [PATCH 4/4] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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.