美文网首页Android开发Android开发Android开发经验谈
Android----单例模式下的一种整体开发思路

Android----单例模式下的一种整体开发思路

作者: pgydbh | 来源:发表于2018-08-09 11:06 被阅读17次

前言

2018/8/9 ,因为涉及到整体的一个开发方式。只是对自己开发思路的一个描述,并不能保证准确,实用,易用。

问题

AsyncTask提供了很大的帮助,但是还是会涉及到内存溢出的问题。

问题1:异步任务的时候为了使用弱引用写了很多重复的代码

例如为了避免使用内部类引用父类,要使用静态内部类,并且要使用弱引用才能控制父类的展示。

问题2:有些时候我们更新一个数据,要改变页面中很多个地方的内容,因为自己的遗漏,导致了数据与显示统一性的问题。

例如通过
好友聊天界面->好友信息界面->好友修改备注界面。修改了好友备注,
返回时候要一层一层 setText(nickname) 保证好友最新的备注被展示。

问题3:有时候更新数据,只是想刷新数据,并不想大张旗鼓,告诉用户现在的状态。

比如用户开始时,获取到本地数据之后,只是想去刷新一下数据,保证数据的最新。

解决思路

问题1:

自定义适合自己代码的异步类,定义好接口,中间使用弱引用的借口作为交互工具。

问题2:

定义所有需要有一定持续性显示的属性为单例类。(每一种数据定义一个单独的单例类),将所有的数据更新事件添加到单例类,在onDestory的时候把数据更新事件从单例类移除。
比如主页显示的内容则应该成为单例类。比如查看某一个好友的更多信息这种只是临时展示一下的内容则不需要成为单例类。
例如在聊天软件中,
1.用户信息(userbean)----用户信息与(个人信息页,修改个人信息页...)有关,并且需要长期显示。
2.好友列表(list<FriendBean>)----好友信息与(好友信息页,好友聊天页,消息页)有关,并需要长期显示。
3.群组列表(list<TeamBean>)----群组信息与(群组信息页,群组聊天页,消息页)有关,并需要长期显示。
4.消息列表(list<ComBean>)----消息列表与(主页是否有新消息,聊天页消息展示,主页消息展示)
5.当前在线状态(boolean onLine)----在线状态与(主要显示是否在线)并需要长期展示状态。
6.好友请求(list<FriendAskBean>)----好友请求与(好友请求页,好友页(点击同意之后),主页展示当前是否有新请求。)有关,并且需要长期提示主页是否有新的请求。
7.群组请求(list<TeamAskBean>)----同上

问题3:

在单例类中把数据操作与数据更新结合,写在一起。在Application类中定义handle,用于接受单例类刷新与之相关的显示的请求。

基本结构

QQ图片20180809103816.png

代码

model
public class Model {

    public List<OnModelChangeListener> listeners;

    public Model() {
        listeners = new LinkedList<>();
    }

    public void actListeners() {
        for (int i = 0; i < listeners.size(); i++) {
            try {
                listeners.get(i).onChange();
            } catch (Exception e) {
                listeners.remove(listeners.get(i));
            }
        }
    }
}
onModelChangeListener
public interface OnModelChangeListener {
    void onChange();
}
AllModel内部定义部分
public class AllModel extends Model {

    public List<RecordBean> recordBeans;

    private static AllModel instance;

    public static AllModel getInstance() {
        if (instance == null){
            instance = new AllModel();
        }
        return instance;
    }

    public int netFlush(){
        try {
            Thread.sleep(2000);
            recordBeans = new ArrayList<>();
            recordBeans.add(new RecordBean(0, "0号", "7:30", "8:00"));
            recordBeans.add(new RecordBean(1, "1号", "8:00", "8:30"));
            recordBeans.add(new RecordBean(2, "2号", "8:30", "9:00"));
            recordBeans.add(new RecordBean(3, "3号", "9:00", "9:30"));
            App.postHandle(App.HANDLE_ALL);
            return App.NET_SUCCEED;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return App.NET_FAILURE;
    }
}
App接受部分
public class App extends Application {

    public static Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == HANDLE_ALL){
                AllModel.getInstance().actListeners();
            }
        }
    };

    public static final int HANDLE_ALL = 100000;
    public static final int HANDLE_MINE = 100001;

    public static void postHandle(int h){
        handler.sendEmptyMessage(h);
    }
}
MainActivity发送部分
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        initLayout();

        App.postRunnable(new FlushRunnable());
    }

    private static class FlushRunnable implements Runnable{

        @Override
        public void run() {
            AllModel.getInstance().netFlush();
        }
    }
AllFragment数据刷新部分
public class AllFragment extends Fragment {


    private View root;

    private ListView lst;
    private BaseAdapter adapter;

    private FlushOnModelChangeListener flushOnModelChangeListener;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        root = inflater.inflate(R.layout.all, null, false);
        initLayout();

        flushOnModelChangeListener = new FlushOnModelChangeListener();
        AllModel.getInstance().listeners.add(flushOnModelChangeListener);
        return root;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        AllModel.getInstance().listeners.remove(flushOnModelChangeListener);
    }
    private class FlushOnModelChangeListener implements OnModelChangeListener{

        @Override
        public void onChange() {
            adapter.notifyDataSetChanged();
        }
    }
}

demo

https://github.com/pgyCode/ShowModelDemo

相关文章

  • Android----单例模式下的一种整体开发思路

    前言 2018/8/9 ,因为涉及到整体的一个开发方式。只是对自己开发思路的一个描述,并不能保证准确,实用,易用。...

  • 设计模式之单例模式

    今日看了下比较常用的单例模式。整体带大家看一下单例模式。 单例是什么 最简单的一种设计模式。比较典型的单例的应用,...

  • python设计模式_单例模式

    上一篇,主要说明了一下MVC这种常见的开发模式,本篇我们来说一下另一种常见的设计思路(单例) 什么是单例模式?在回...

  • iOS开发中常用的系统单例

    单例模式是开发中常见的一种模式,苹果也给我们提供了很多这样的单例,总结一下大部分常见的系统单例 常用: [UIAp...

  • 单例

    在iOS开发时,总是会遇到单例模式,单例即是一种模式,更是一种思想,单例模式是借鉴了数学中的单集合。就是一个集合中...

  • 【浅析iOS中常用设计模式】

    单例模式 单例模式是iOS开发中常用的一种设计模式,目的在于创建一次对象,多地方使用。系统中的单例例如:UIApp...

  • Java 单例模式

    单例模式是开发中较为常见也较为简单的一种设计模式,单例模式的实现有多种,每种都有自己的特点,在这里整理一下,从而可...

  • 前端开发工程师必备系列-几个简单的JS单例模式

    前端开发工程师必备系列-几个简单的JS单例模式 JavaScript单例模式 1. 单例模式 单例模式(Singl...

  • 设计模式之单例概述

    单例作为开发中常用的一种设计模式,有着非常广泛的应用。今天来具体说说单例模式的相关内容。 1.什么是单例? 单例是...

  • iOS • 记——MRC和ARC环境下的单例模式对比

    单例模式是程序开发中一种设计模式,是前人在多年开发经验中,总结出来的一套有助于提高开发效率的方法。单例模式的作用:...

网友评论

    本文标题:Android----单例模式下的一种整体开发思路

    本文链接:https://www.haomeiwen.com/subject/kwpwvftx.html