小白学习Android MVP和SharedPreferences存储JSONArray

以前大家开发android应用用的都是MVC,但是会感觉到M和V在Activity中的频繁交互使得代码变得臃肿,代码行数

很容易达到上千行。不仅如此,MVC的使用使得代码得可阅读性和可维护性已经可扩展性非常低,一些小功能的增加、

删除、修改和查询非常艰难,尤其是代码转接给别人维护时。

MVP模式的出现很好地解决了这些问题,你会发现用了MVP模式以后,再也不想用MVC模式了。MVP模式的代码包结

构如图:

M层的接口写未实现的逻辑方法,用M层的实现类来实现所有的逻辑方法;V层的接口写未实现的界面交互的方

法,用V层的实现类即Activity或者Fragment来实现所有的界面交互的方法;P层的类中通过构造方法来实现M和V的沟

通和交互,P其实就是中介者的身份。这样使得M和V完全分开,各司其职。

SharedPreferences存储数据需要SharedPreferences对象和Editor对象,Editor对象存储数据,

SharedPreferences对象读取数据。

程序运行效果如图:

代码如下:

1.界面布局activity_main:

<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn_jsonArray"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="生成JSONArray" />

    <TextView
        android:id="@+id/tv_jsonArrayContent"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4"
        android:gravity="center"
        android:text="@string/hello_world"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_jsonArrayParse"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="解析JSONArray" />

    <TextView
        android:id="@+id/tv_jsonArrayParseContent"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4"
        android:gravity="center"
        android:text="@string/hello_world"
        android:textSize="20sp" />

</LinearLayout></span>

2.主界面Model接口MainModelInterface:

<span style="font-size:18px;">package com.msd.spsavejsonarray.model.interfaces;

/*
 * 主界面模型接口
 */
public interface MainModelInterface {
	/*
	 * 生成JSONArray
	 */
	String generateSpSaveJSONArray();

	/*
	 * 解析JSONArray
	 */
	String parseSpSaveJSONArray(String jsonArrayContent);

}

</span>

3.主界面Model接口的实现类MainModelClass:

<span style="font-size:18px;">package com.msd.spsavejsonarray.model.classes;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.msd.spsavejsonarray.model.interfaces.MainModelInterface;

/*
 * 主界面模型接口的实现类
 */
public class MainModelClass implements MainModelInterface {

	/*
	 * (non-Javadoc)生成JSONArray的实现
	 *
	 * @see com.msd.spsavejsonarray.model.interfaces.MainModelInterface#
	 * generateSpSaveJSONArray()
	 */
	@Override
	public String generateSpSaveJSONArray() {
		JSONArray jsonArray = new JSONArray();
		JSONObject jsonObject;
		for (int i = 0; i < 5; i++) {
			jsonObject = new JSONObject();
			try {
				jsonObject.put("id", "id_" + i);

				jsonObject.put("name", "name_" + i);
				jsonArray.put(jsonObject);
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		return jsonArray.toString();
	}

	/*
	 * (non-Javadoc)解析JSONArray的实现,返回字符串
	 *
	 * @see com.msd.spsavejsonarray.model.interfaces.MainModelInterface#
	 * parseSpSaveJSONArray(java.lang.String)
	 */
	@Override
	public String parseSpSaveJSONArray(String jsonArrayContent) {
		StringBuilder stringBuilder = new StringBuilder();
		try {
			JSONArray jsonArray = new JSONArray(jsonArrayContent);
			JSONObject jsonObject;
			for (int i = 0; i < jsonArray.length(); i++) {
				jsonObject = (JSONObject) jsonArray.get(i);
				stringBuilder.append("第" + i + "项:" + "id为"
						+ jsonObject.getString("id") + " name为"
						+ jsonObject.getString("name") + "\n");

			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return stringBuilder.toString();

	}

}

</span>

4.主界面view接口MainViewInterface:

<span style="font-size:18px;">package com.msd.spsavejsonarray.view.interfaces;

/*
 * 主界面view接口
 */
public interface MainViewInterface {
	/*
	 * 显示生成的JSONArray
	 */
	void showGenerateJSONArray(String jsonArrayString);

	/*
	 * 显示解析的JSONArray
	 */
	void showParseJSONArray(String jsonArrayParseString);
}

</span>

5.主界面View接口实现类MainActivity:

<span style="font-size:18px;">package com.msd.spsavejsonarray.view.classes;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

import com.msd.spsavejsonarray.R;
import com.msd.spsavejsonarray.presenter.MainPresenter;
import com.msd.spsavejsonarray.view.interfaces.MainViewInterface;

/*
 * 主界面View接口实现类
 */
public class MainActivity extends Activity implements OnClickListener,
		MainViewInterface {
	private SharedPreferences sharedPreferences;// sharedPreferences对象
	private static Editor editor;// Editor对象
	private String spName = "SPSAVEJSONARRAY";// SP存储的文件名称
	private MainPresenter mainPresenter;// 主界面presenter对象
	private TextView tv_jsonArrayContent;// 显示生成的JSONArray的TextView
	private TextView tv_jsonArrayParseContent;// 显示解析的JSONArray的TextView

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mainPresenter = new MainPresenter(this);

		sharedPreferences = getSharedPreferences(spName, MODE_PRIVATE);// 私有模式
		editor = sharedPreferences.edit();

		tv_jsonArrayContent = (TextView) findViewById(R.id.tv_jsonArrayContent);
		tv_jsonArrayParseContent = (TextView) findViewById(R.id.tv_jsonArrayParseContent);
		findViewById(R.id.btn_jsonArray).setOnClickListener(this);
		findViewById(R.id.btn_jsonArrayParse).setOnClickListener(this);
	}

	/*
	 * 如果在Activity中引用presenter执行耗时操作,而Activity被销毁时,presenter对象会一直持有Activity对象,
	 * 有可能引起内存泄漏,所以执行保险操作,在onDestroy()中清空Activity对presenter对象的引用,
	 * 或者清空prensenter对象对Acitvity对象的引用(non-Javadoc)
	 *
	 * @see android.app.Activity#onDestroy()
	 */
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		mainPresenter = null;

	}

	/*
	 * 点击事件
	 *
	 * @see android.view.View.OnClickListener#onClick(android.view.View)
	 */
	@Override
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.btn_jsonArray:// 生成JSONArray
			mainPresenter.generateSpSaveJSONArray();

			break;
		case R.id.btn_jsonArrayParse:// 解析JSONArray
			mainPresenter.parseSpSaveJSONArray();
			break;

		default:
			break;
		}

	}

	/*
	 * 显示生成的JSONArray(non-Javadoc)
	 *
	 * @see
	 * com.msd.spsavejsonarray.view.MainViewInterface#showGenerateJSONArray(
	 * java.lang.String)
	 */
	@Override
	public void showGenerateJSONArray(String jsonArrayString) {
		editor.putString(spName, jsonArrayString).commit();// 将生成的JSONArray存储起来
		tv_jsonArrayContent.setText(jsonArrayString);
		// tv_jsonArrayParseContent.setText(sharedPreferences.getString(spName,
		// "[]"));//通过sp获取生成的JSONArray
	}

	/*
	 * 显示解析的JSONArray(non-Javadoc)
	 *
	 * @see
	 * com.msd.spsavejsonarray.view.MainViewInterface#showParseJSONArray(java
	 * .lang.String)
	 */
	@Override
	public void showParseJSONArray(String jsonArrayParseString) {

		tv_jsonArrayParseContent.setText(jsonArrayParseString);

	}

}

</span>

6.主界面presenter,MainPresenter:

<span style="font-size:18px;">package com.msd.spsavejsonarray.presenter;

import com.msd.spsavejsonarray.model.classes.MainModelClass;
import com.msd.spsavejsonarray.model.interfaces.MainModelInterface;
import com.msd.spsavejsonarray.view.interfaces.MainViewInterface;

/*
 * 主界面presenter
 */
public class MainPresenter {
	private MainModelInterface mainModelInterface;// 主界面Model接口实现类的对象
	private MainViewInterface mainViewInterface;// 主界面View接口实现类的对象,即MainActivity

	/*
	 * 构造方法实现M和V的交互
	 */
	public MainPresenter(MainViewInterface mainViewInterface) {
		mainModelInterface = new MainModelClass();
		this.mainViewInterface = mainViewInterface;
	}

	/*
	 * 生成JSONArray
	 */
	public void generateSpSaveJSONArray() {
		mainViewInterface.showGenerateJSONArray(mainModelInterface
				.generateSpSaveJSONArray());
	}

	/*
	 * 解析JSONArray
	 */
	public void parseSpSaveJSONArray() {
		mainViewInterface.showParseJSONArray(mainModelInterface
				.parseSpSaveJSONArray(mainModelInterface
						.generateSpSaveJSONArray()));
	}
}
</span>

总结:以上代码看起来非常小题大做,但是到了真正做项目的时候,如果界面比较复杂, 界面交互要素较多的时候,MVP的优点就完全展示出来了,Activity中上千行的代码变得条理清楚,非常精简,非常容易维护和修改。

代码下载:

点击打开链接

时间: 2024-11-05 22:35:39

小白学习Android MVP和SharedPreferences存储JSONArray的相关文章

【Mark】Android应用开发SharedPreferences存储数据的使用方法

Android应用开发SharedPreferences存储数据的使用方法 SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据. 1.使用SharedPreferences保存数据方法如下: //实例化SharedPreferences对象(第一步) SharedPreferences mySharedPreferences=

Android应用开发SharedPreferences存储数据的使用方法

SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据 SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对).SharedPreferences常用来存储一些轻量级的数据. //实例化SharedPreferences对象(第

Android开发:SharedPreferences 存储数据、获取数据

email:[email protected] 开发环境:win7 64位,Android Studio. 关于SharedPreferences.个人理解把它理解为一种轻量级的Database.存取形式和map一样:<key,value>,以xml文件存储. 我仅仅是用它来存储一下登录信息和登录状态,这样每次登录的时候就能够从本地读取信息. 一.存储 /** * 保存个人信息在本地 */ SharedPreferences sharedPreferences = getSharedPrefe

【Android】数据的应用-使用sharedpreferences存储数据

Android应用开发SharedPreferences存储数据的使用方法 SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据. 1.使用SharedPreferences保存数据方法如下: //实例化SharedPreferences对象(第一步) SharedPreferences mySharedPreferences=

[Android] 使用JSON和SharedPreferences存储用户自定义类

先看一下Google官方对于SharedPreferences的定义: The SharedPreferences class provides a general framework that allows you to save and retrieve persistent key-value pairs of primitive data types. You can use SharedPreferences to save any primitive data: booleans,

Android学习之简单的数据存储

在Android中,数据存储是开发人员不可以避免的.Android为开发者提供了很多的存储方法,在前面的博客中,已经讲述了sqlite存储数据.今天将介绍用SharedPreferences来存储数据,它可以将数据保存在应用软件的私有存储区,存储区的数据只能被写入这些数据的软件读取.SharedPreference通过键值对的方法存储数据. 1.SharedPreference存储简单数据 SharedPreference可以存放简单的String.Boolean.Int等对象. 1 <Rela

学习Android之SharedPreferences使用

效果图如下: 当我们想让自己的属性设置保存下来,这时就需要SharedPreferences. 上面这个小程序,音乐状态是保存下来的.使用的上一次退出的状态. 进入DDMS,data文件下的data文件中,找到自己的包名文件,双击打开,有shared_prefs文件,里面有xml文件,这就是配置文件. 本程序使用了android的上下键,同常我们的模拟器的方向键是不能用的,这是就需要我们打开它,在C盘下找到文件 .android,双击avd文件,找到你的模拟器的文件夹,双击打开,找到config

Android SharedPreferences存储

一 概念 SharedPreferences存储方式是Android中存储轻量级数据的一种方式.SharedPreferences存储主要用来存储一些简单的配置信息,内部以Map方式进行存储,因此需要使用键值对提交和保存数据,保存的数据以xml格式存放在本地的/data/data/<package name>/shares_prefs文件夹下. 二 特点 1,        使用简单,便于存储轻量级的数据: 2,        只支持Java基本数据类型,不支持自定义数据类型: 3,     

Android入门(九)文件存储与SharedPreferences存储

原文链接:http://www.orlion.ga/578/ Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储.SharedPreference存储以及数据库存储.当然,除了这三种方式之外,你还可以将数据保存在手机的 SD卡中,不过使用文件.SharedPreference或数据库来保存数据会相 对更简单一些,而且比起将数据保存在 SD卡中会更加的安全 一.文件存储 1.将数据存储到文件中 Context类中提供了一个 openFileOutput ()方法,可以用