前言
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();
}
}
}
网友评论