Android之 用MVP模式 来实现webview 历史记录保存与显示

MVP在android上是常见的一种设计模式,在Launhcer,手机浏览器里面经常会看到,观摩了下其他大神写的,现在总结下,操刀起来写个demo

有什么问题的地方请提出来。

大家一起研究讨论。

demo 下载地址;http://download.csdn.net/detail/xufeifandj/8267619

demo主要是 主页是一个webview,实现了 历史记录的添加,与显示。例子比较简单。

整个项目的结构如下:

HistoryPresenter.java 主要是对view与model的控制相当于MVC中的 控制层吧。

具体实现添加历史记录移除历史记录等业务逻辑,都在HistoryModel里面去实现了。而UI.java则是一个接口,通过业务逻辑分析,把数据交予UI去通知MainAcitivy更新View.

package com.ferris.ferrismvp.presenter;

import java.util.List;

import com.ferris.ferrismvp.UI;
import com.ferris.ferrismvp.beam.History;
import com.ferris.ferrismvp.model.HistoryModel;
import com.ferris.ferrismvp.model.IHistoryModel;

public class HistoryPresenter {
	private UI ui;
	private IHistoryModel iHistoryModel;
	public HistoryPresenter(UI ui) {
		// TODO Auto-generated constructor stub
		this.ui=ui;
		this.iHistoryModel=new HistoryModel();
	}

	/**
	 * 添加历史记录
	 * @param hisString
	 */
	public void AddHistory(History hisString){
		iHistoryModel.addHistory(hisString);
	}

	/**
	 * 一掉历史记录
	 * @param hisString
	 */
	public void removeHistory(History hisString){
		iHistoryModel.removeHistory(hisString);
	}
	/**
	 * 显示所有历史记录
	 */
	public void showHistorys(){
		List<History> histories=iHistoryModel.showAllHistory();
		ui.showAllHistory(histories);
	}
}

历史记录Model业务逻辑接口,添加删除,查询3个方法。

package com.ferris.ferrismvp.model;

import java.util.List;

import com.ferris.ferrismvp.beam.History;

public interface IHistoryModel {

	public void addHistory(History history);
	public void removeHistory(History history);
	public List<History>  showAllHistory();
}

具体实现逻辑

package com.ferris.ferrismvp.model;

import java.util.ArrayList;
import java.util.List;

import com.ferris.ferrismvp.beam.History;

public class HistoryModel implements IHistoryModel{
	private List<History> historys=new ArrayList<History>();
	public HistoryModel() {
		// TODO Auto-generated constructor stub

	}

	@Override
	public void addHistory(History history) {
		// TODO Auto-generated method stub
		historys.add(history);
	}

	@Override
	public void removeHistory(History history) {
		// TODO Auto-generated method stub
		int removeId=-1;
		for(int i=0;i<historys.size();i++){
			if(historys.get(i).getUrl().equals(history.getUrl())){
				removeId=i;
			}
		}

		if(removeId!=-1){
			historys.remove(removeId);
		}
	}

	@Override
	public List<History> showAllHistory() {
		// TODO Auto-generated method stub
		return historys;
	}

}

History Bean对象

package com.ferris.ferrismvp.beam;

public class History {
	private String title;
	private String url;
	public History() {
		// TODO Auto-generated constructor stub
	}

	public History(String title,String url) {
		// TODO Auto-generated constructor stub
		this.title=title;
		this.url=url;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}

}

UI接口类

package com.ferris.ferrismvp;

import java.util.List;

import com.ferris.ferrismvp.beam.History;

public interface UI {
	public void showAllHistory(List<History> historys);
}
package com.ferris.ferrismvp;

import java.util.List;

import com.ferris.ferrismvp.beam.History;
import com.ferris.ferrismvp.presenter.HistoryPresenter;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity implements OnClickListener,UI{
	private WebView webView1 ;
	private Button addHistory,showHistory;
	private HistoryPresenter historyPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findView();
        initWebView();

        historyPresenter=new HistoryPresenter(this);
    }

	private void initWebView() {
		// TODO Auto-generated method stub
		webView1.getSettings().setJavaScriptEnabled(true);
		webView1.loadUrl("http://www.baidu.com");
	}

	private void findView() {
		// TODO Auto-generated method stub
		webView1=(WebView)findViewById(R.id.webView1);
		addHistory=(Button)findViewById(R.id.button1);
		showHistory=(Button)findViewById(R.id.button2);
        addHistory.setOnClickListener(this);
        showHistory.setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.button1://添加历史记录
			historyPresenter.AddHistory(new History(webView1.getTitle(),webView1.getUrl()));
			break;
		case R.id.button2://显示历史记录
			historyPresenter.showHistorys();
			break;

		default:
			break;
		}
	}

	@Override
	public void showAllHistory(List<History> historys) {
		// TODO Auto-generated method stub
		Toast.makeText(MainActivity.this, historys.toString(), Toast.LENGTH_SHORT).show();
	}

}
时间: 2024-12-26 16:17:37

Android之 用MVP模式 来实现webview 历史记录保存与显示的相关文章

Android开发中MVP模式浅析

目前为止,MVP的使用还没有一个标准,在此先记录一下目前学习到的一些Android中使用MVP的知识. 按传统的方式开发,经常会使Activity中混杂着UI交互,业务逻辑等流程.而MVP模式能巧妙的解决这个问题.先直接上一个小例子吧. /** * 定义一个对UI组件进行操作的接口,让Activity实现这个接口 * @author Quinn * @date 2015-5-9 */ public interface LoginView { public void showProgress();

Android上的MVP模式

什么是MVP? MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.首先要澄清就是MVP不是一个结构化的模式,它只是负责显示层而已,任何时候都可以在自己的项目结构中使用MVP模式. 为什么要使用MVP? 我们知道在Android上逻辑接口和数据存取是紧耦合的,这个问题可以看看CursorAdapter这个例子,它既融合了适配器,同时也有显示的成分,而cursor很大程度上应该是数据数据存取层的. 对于一个可扩

Android上实现MVP模式的途径

今天我想分享我在Android上实现MVP(Model-View-Presenter)模式的方法.如果你对MVP模式还不熟悉,或者不了解为什么要在Android应用中使用MVP模式,推荐你先阅读这篇维基百科文章和这篇博客. 使用Activity和Fragment作为View合适么? 目前,在很多使用了MVP模式的Android项目中,主流做法是将Activity和Fragment作为视图层来进行处理.而Presenters通常是通过继承被视图层实例化或者注入的对象来得到的.我认可这种方式可以节省

Android开发之MVP模式的使用

前几天发现,在Android项目代码里有一个Activity类行数居然有1000多行,而600行左右都是逻辑控制,真正和页面控件处理相关的代码不多,虽然可以用#region <>...#endregion块包起来,但是整体来说,页面和逻辑处理揉得太紧密了,有时代码复用起来也不方便,于是,决定重构,找了一下,有MVP(Model-View-Presenter,Model层负责数据管理,View层负责页面控件数据展示与设置,Presenter负责逻辑处理,控制View层如何显示与展示数据,这种层次

在Android上用MVP模式编程的实践

首先,谁是V?谁是P?(M我认为不是问题) View,应该是实现显示逻辑,在Android开发中,我们认为Fragment.Activity都可以被当做View,他们主要任务就是控制显示逻辑,这部分代码不太经常重用.View通过调用P的业务逻辑,来实现业务.业务包括同步的业务(可以在UI线程操作)和异步的任务(如网络.磁盘IO等耗时操作),并根据P的业务返回结果来响应地改变UI. 对Presenter的实现,我们用AndroidAnnotations框架的EBean实现(如果不熟悉这个框架,请G

Android开发学习--MVP模式入门

1.模型与视图完全分离,我们可以修改视图而不影响模型2.可以更高效地使用模型,因为所有的交互都发生在一个地方--Presenter内部3.我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑.这个特性非常的有用,因为视图的变化总是比模型的变化频繁.4.如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试) 下面示例一个小案例: 项目架构: 首先bean层: User.java public class User { privat

Android架构篇--MVP模式的介绍篇

摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趋势,笔者曾经在商业项目中从零开始大规模采用过MVP模式对项目进行开发.在使用MVP模式进行开发的时候发现项目的结构模式对开发是有一定的影响的,在这里笔者会对这一问题进行探讨.希望通过这篇blog能让读者了解如何使用MVP模式搭建一个功能完善的MVP模式开发框架,避免一些笔者认为比较严重的问题. 为什么要使用MVP模式 在传统的Android开发中,我们一般是使用MVC模式进行开发的.传统MVC模式介绍: View: 视图层,对应x

MVP模式

在传统的Android开发中,我们一般是使用MVC模式进行开发的. 传统MVC模式介绍: View: 视图层,对应xml文件 Controller: 控制层,对应Activity和Fragment层,进行数据处理 Model:实体层,负责获取实体数据 在Android开发中采用MVC模式的一个最大的弊端就是xml作为View层视图能力实在太弱,所以一般情况下我们都是通过Controller层来辅助处理一些视图的.这样的结果就导致Controller既作为控制层的同时又承担了View层的大部分功能

android MVP模式简单介绍

原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到了越来越多的关注,但在项目开发中选择一种这样的软件设计模式需保持慎重心态,一旦确定 使用MVP作为你App的开发模式那么你就最好坚持做下去,如果在使用MVP模式开发过程中发现问题而且坑越来越大,这时你想用MVC等来重新设计的话基 本上就等于推倒重来了.要知道在Android上MVP在现在为止并没有统