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();
}
}
相關推薦
Android之 用MVP模式 來實現webview 歷史記錄儲存與顯示
MVP在android上是常見的一種設計模式,在Launhcer,手機瀏覽器裡面經常會看到,觀摩了下其他大神寫的,現在總結下,操刀起來寫個demo 有什麼問題的地方請提出來。 大家一起研究討論。 demo 下載地址;http://download.csdn.net/deta
微信發個朋友圈沒有想到也可以用設計模式來實現——觀察者模式
觀察者模式的概念 觀察者模式(Observer Pattern):定義物件之間的一種一對多依賴關係,使得每當一個物件狀態發生改變時,其相關依賴物件皆得到通知並被自動更新。觀察者模式的別名包括髮布-訂閱(Publish/Subscribe)模式、模型-檢視(M
程式設計師突發奇想,如何巧用設計模式來實現【聚合支付非同步回撥】
什麼是模版方法 1.定義了一個操作中的演算法的骨架,而將部分步驟的實現在子類中完成。 模板方法模式使得子類可以不改變一個演算法
用連結串列來實現學生資訊的儲存
連結串列是線性表的鏈式儲存結構,有單鏈表、迴圈單鏈表、雙鏈表、迴圈雙鏈表、順序連結串列。 連結串列不能夠進行隨機訪問,但在插入和刪除資料時不需要移動元素,比順序結構操作簡單。 簡單程式實現: #include<iostream> #include<stdl
表達異常的分支時,少用 if-else 方式(可以使用衛語句、策略模式或者狀態模式來實現)
避免後續程式碼維護困難, if-else儘量不要超過3層, 可以嘗試使用衛語句、策略模式或者狀態模式 衛語句: 衛語句就是把複雜的條件表示式拆分成多個條件表示式,比如一個很複雜的表示式,嵌套了好幾層的i
開發者的進階之路:用語法樹來實現預編譯
能夠 項目 未來 部分 領域 編譯器 提高 cfb ima 如何在保證安全性的前提下,提升開發過程的效率,是每個開發者都在不斷探索的問題。借助語法樹,開發者能夠更好地展現和修改源程序代碼,優化開發環節,提高安全系數,還能進一步實現安卓預編譯。 本文基於個推高級研發工程師李健
android之用scrollview實現控制元件滑動固定效果
專案中最近用到需要佈局滑動到某一個地方的時候某個控制元件固定在螢幕頂部不動,就去研究了下,思路其實挺簡單的。我置頂的懸浮控制元件上邊還需要留個控制元件,比如搜尋框之類的,專案需求不一樣就留的不一樣,所以就研究了一下,網上也有很多,其實方法思路都一樣的,很簡單,自定義一下Sc
Android之用Handler實現主執行緒和子執行緒互相通訊以及子執行緒和子執行緒之間的通訊
1、上程式碼 activity_main.xml檔案 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.
為什麼用列舉類來實現單例模式越來越流行?
前言 單例模式是 Java 設計模式中最簡單的一種,只需要一個類就能實現單例模式,但是,你可不能小看單例模式,雖然從設計上來說它比較簡單,但是在實現當中你會遇到非常多的坑,所以,繫好安全帶,上車。 單例模式的定義 單例模式就是在程式執行中只例項化一次,建立一個全域性唯一物件,有點像 Java 的靜態變數,但是
Android開發學習--MVP模式入門
handle ges span findview list pass override appcompat over 1、模型與視圖完全分離,我們可以修改視圖而不影響模型2、可以更高效地使用模型,因為所有的交互
LeetCode 225 Implement Stack using Queues(用隊列來實現棧)(*)
using man mean leetcode == peek uil erl end 翻譯 用隊列來實現棧的例如以下操作。 push(x) —— 將元素x加入進棧 pop() —— 從棧頂移除元素 top() —— 返回棧頂元素 empty() —
設計模式之單例模式 Singleton實現
-- throw return null mage demo1 nbsp 定義 所在 餓漢式 餓漢式單例模式,static變量會在類裝載時初始化,此時也不會涉及多個線程對象訪問該對象的問題。虛擬機保證只會裝載一次該類,肯定不會發生並發訪問的問題,
劍指offer五之用兩個棧實現隊列
stat play color return ret gif 隊列 tac min 一、題目 用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。 二、思路 1、Push操作:將數據直接壓入stack1即可 2、P
[LeetCode] 225. Implement Stack using Queues 用隊列來實現棧
leetcode follow whether nothing sta BE may ack cti Implement the following operations of a stack using queues. push(x) -- Push element
淺談model1模式及使用model1模式來實現瀏覽商品
需要實現功能: 1.從資料庫中讀取各個商品的資訊 2.點選某個圖片會顯示商品的詳細資訊 3.在顯示商品頁面的右邊會顯示你最近瀏覽過的商品 效果圖: 使用model1模式來實現 1.需要實現資料庫連結的DBHelper類
設計模式之普通工廠模式(Java實現版本)
工廠模式是設計模式中非常容易理解的模式之一。簡單來說,工廠模式就是替代new操作的一種方式,比如我們去飯店要茶水,工廠就像是服務員,只要告訴服務員我要茶水,服務員就會把茶壺拿來,而不需要我們自己去拿茶水(好比於在main方法中直接new Tea();) 接下來貼上例子,為了方便,把所有的程式碼都
設計模式之單例模式(Java實現版)
單例模式作用在一個類上,這個類提供了一種方法來訪問它的唯一物件,可以直接訪問,而不需要例項化類的物件。單例模式的作用是保證一個類只有一個物件例項。 class Singleton { private static Singleton instance = new Singleton()
設計模式之抽象工廠模式(Java實現)
抽象工廠是一個超級工廠,用來建立其他工廠,又稱為工廠的工廠,也就是對各種不同的工廠再次進行抽象。在抽象工廠模式中,介面負責建立相關物件的工廠, 每個生成的工廠可以按照工廠模式提供物件。 首先建立兩個介面然後實現具體類 //再建立一個介面Plant interface Plant {
所謂的網頁爬蟲用java程式碼來實現,此程式碼適合在maven專案中使用中使用,因為,程式碼中的類所對應的依賴可以讓maven下載。
//獲得httpClient物件 CloseableHttpClient httpClient = HttpClients.createDefault(); //url公司域名隨便 String url = "https://www.baidu.co
通過策略模式來實現redis的單機版和叢集版的轉換
(1)首要介面JedisClient package com.wine.jedis; public interface JedisClient { String set(String key, String value); String get(String key); Boo