基于Android平台阅读阅览器,基于android MVP的Rss阅读器

最近在学习Android的MVP模式,就是MVP(Model-View-Presenter),网上大部分都是比较小的例子,所以想拿个小项目练手,于是采用了基于Rss feed的阅读器。

1.Rss feeds是什么?

是一种根据XML特性所制定的格式,将网页内容抽取出来,读者订阅RSS Feed,即可直接取得有兴趣的资讯。简单来说就是一种xml。

2.MVP是什么?

解决的问题: 不让activity承接太多任务 ;使得Model和View层解耦,职责划分明显。结构清晰。(感觉说了跟白说一样)

1.Model 提供数据

2.View 负责显示

3.Presenter 逻辑的处理,作为Model和view的中间者,从Model获得数据然后控制view显示.

3.整个结构:

3d3a4b2c416b

Paste_Image.png

具体效果:

3d3a4b2c416b

Paste_Image.png

4.怎么获取Rss feeds数据?

我在这里使用的是volley + 自定义的xmlRequest,在文章底部有附源码,主要写大概获取和使用方式:

首先自定义一个接口:

public interface RssLoadListener {

void onLoadSuccess(List rssInfoList);//获取成功

void onLoadFailed();//获取失败

void onNetWorkFailed();//网络错误

void onBeginLoad();//开始任务

}

让RssLoad下载任务时候实现这个接口并作为参数传进去, 有了这个接口,我们在哪里需要下载数据的时候就可以这么应用:

new RssLoadModel(context,RSS_URL).excute(new RssLoadListener() {

@Override

public void onBeginLoad() {

view.showLoading();//刚开始下载的操作

}

@Override

public void onLoadSuccess(List rssInfoList) {

//下载成功后要做什么

Log.d(TAG, "onLoadSuccess: ");

view.hideLoading();

view.showResult(rssInfoList);

}

@Override

public void onLoadFailed() {

//若失败后的操作

view.hideLoading();

view.showError("更新失败");

}

@Override

public void onNetWorkFailed() {

view.showError("网络不可用");

view.hideLoading();

}

});

RssLoadModel是一个负责下载的类,里面的excute方法负责下载,并在下载过程中调用loadListener的方法,比如下载成功就调用onLoadSuccess(),至于里面成功后应该怎么做,就由你来实现,这样就达到了将状态和结果传递出去的目的。

public void excute(final RssLoadListener loadListener){

if(!NetworkUtils.isNetworkAvailable(context)){

loadListener.onNetWorkFailed();//网络失败

return;

}

loadListener.onBeginLoad();

XMLRequest xmlRequest = new XMLRequest(Constants.RSS_URL,

new Response.Listener() {

@Override

public void onResponse(XmlPullParser response) {

parserXML(response);

loadListener.onLoadSuccess(rssInfos);

//调用下载成功,将结果传递出去

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

Log.e("TAG", error.getMessage(), error);

loadListener.onLoadFailed();//失败

}

});

mQueue.add(xmlRequest);

}

XMLRequest 是继承volley.Request的自定义类,volley是一个方便Android应用网络操作框架,默认没有XML的request,(宝宝不开心):

public class XMLRequest extends Request {

private final Response.Listener mListener;

public XMLRequest(int method, String url, Response.Listener listener,

Response.ErrorListener errorListener) {

super(method, url, errorListener);

mListener = listener;

}

public XMLRequest(String url, Response.Listener listener, Response.ErrorListener errorListener) {

this(Method.GET, url, listener, errorListener);

}

@Override

public Map getHeaders() throws AuthFailureError {

//需要加,否则获取不到数据

HashMap headers = new HashMap();

headers.put("Content-Type", "application/xml; charset=utf-8");

return headers;

}

@Override

protected Response parseNetworkResponse(NetworkResponse response) {

try {

String xmlString = new String(response.data,

HttpHeaderParser.parseCharset(response.headers));

Log.d("tag",xmlString);

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

XmlPullParser xmlPullParser = factory.newPullParser();

xmlPullParser.setInput(new StringReader(xmlString));

return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));

} catch (UnsupportedEncodingException e) {

return Response.error(new ParseError(e));

} catch (XmlPullParserException e) {

return Response.error(new ParseError(e));

}

}

@Override

protected void deliverResponse(XmlPullParser response) {

mListener.onResponse(response);

}

}

5.mvp

VIew

MvpView类是个接口

public interface MvpView {}

RssView 继承MvpView接口,具体的View类需要实现下面的方法,那么presenter想要控制具体的View类操作,就可以直接调用showLoading()等方法,这也是针对抽象编程。

public interface RssView extends MvpView {

/**

* 显示loading下载视图

*/

void showLoading();

/**

*隐藏loading下载视图

*/

void hideLoading();

/**

* 显示错误信息

* @param msg

*/

void showError(String msg);

/**

* 显示结果

* @param rssInfos

*/

void showResult(List rssInfos);

/**

* @param title

*/

void showTitle(String title);

}

具体的view类,这里使用Activity作为view类,现在很多都将fragment作为view,将activity控制生命周期。

public class MainActivity extends BaseActivty implements RssView

需要实现下列方法,实现这么多方法给谁调用呢?当然是Presenter了。

@Override

public void showLoading() {//显示下载

progressWheel.setVisibility(View.VISIBLE);

swipeRefreshLayout.setVisibility(View.GONE);

ValueAnimator progressFadeInAnim = ObjectAnimator.ofFloat(progressWheel, "alpha", 0, 1, 1);

progressFadeInAnim.start();

}

@Override

public void hideLoading() {//隐藏下载

progressWheel.setVisibility(View.GONE);

swipeRefreshLayout.setVisibility(View.VISIBLE);

swipeRefreshLayout.setRefreshing(false); // close refresh animator

ValueAnimator progressFadeInAnim = ObjectAnimator.ofFloat(progressWheel, "alpha", 1, 0, 0);

progressFadeInAnim.start();

}

@Override

public void showError(String msg) {//显示错误信息

new SweetAlertDialog(this, SweetAlertDialog.ERROR_TYPE)

.setTitleText("Oops...")

.setContentText(msg)

.show();

}

@Override

public void showResult(List rssInfos) {//显示结果

rssAdapter.setRssInfos(rssInfos);

}

@Override

public void showTitle(String title) {//显示标题

((TextView)findViewById(R.id.toolbar_title)).setText(title);

}

Presenter

MvpPresenter 接口,里面有两个方法attachView和detachView,负责将MvpView 绑定在MvpPresenter和解除绑定;例如在view类里面调用

presenter.attachView(this);

将自己传进去,这样 presenter就拥有了view,也就可以随心所欲地控制view了,Presenter通过接口进行对View的操作。

public interface MvpPresenter {

/**

* 将 MvpView 绑定在MvpPresenter

* @param view

*/

public void attachView(V view);

/**

* @param retainInstance

* 解除绑定

*/

public void detachView(boolean retainInstance);

}

RssPresenter类

/**

* Created by cheng on 16-7-24.

*/

public class RssPresenter implements MvpPresenter {

private final static String TAG = "RssPresenter";

private RssView view;

private Context context;

public RssPresenter(Context context) {

this.context = context;

}

public void startLoadTask() {//开始下载

if (view == null) {

Log.w(TAG, "please attach view first.");

return;

}

new RssLoadModel(context,RSS_URL).excute(new RssLoadListener() {

@Override

public void onBeginLoad() {

view.showLoading();

}

@Override

public void onLoadSuccess(List rssInfoList) {

Log.d(TAG, "onLoadSuccess: ");

view.hideLoading();

view.showResult(rssInfoList);

}

@Override

public void onLoadFailed() {

view.hideLoading();

view.showError("更新失败");

}

@Override

public void onNetWorkFailed() {

view.showError("网络不可用");

view.hideLoading();

}

});

}

@Override

public void attachView(RssView view) {

this.view = view;

}

@Override

public void detachView(boolean retainInstance) {

// TODO

}

}

7.不足

mvp clean模式

对mvp理解还比较浅显,继续学习。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值