8.14安卓涉及的设计模式(适配器 命令)
设计模式有很多,一个一个学不太现实,我是走安卓开发的。着重看一看安卓涉及的设计模式。
1.适配器模式adapter。
这个东西我第一次见是别人已经做好了的音乐搜索功能。其中暂时音乐列表需要用到listview。然后已经写好了adapter。
(吐槽一下,我大三上18.9就已经学习了移动应用开发,知道19.7月做了一个音乐播放器,才有了感觉,后面在星网锐捷线下实训有了更加深入的理解)
第一次看见我也只能用别人的东西。
废话少说:
目的:适配,让接口满足新环境等等。
例子:
优点:灵活
代码:
1.接口A(1) 接口B(2 3)
2.实现B的类C(2(!),3) 实现B的类D(2,3(!))
3.实现A的适配器类E E包含(B的对象?) 一个适配器对象用B来指向 C和D 使用(2 3功能)同时使用1功能
4.类X 实现了接口A 内置A 对象把功能1支持j 同时也有 2 3
5.使用:X的实例x x.1() x.2() x.3() x.4() 4不可以用。
上面还是太抽象了。我总结一下:这样做哟什么好处,你要加上4的功能可以 加在接口A 里面然后实现 扩展性好。
安卓怎么用:
public class MyViewAdapter extends BaseAdapter {
private Context mContext;
private ArrayList mList = new ArrayList();
public MyViewAdapter(Context mContext,ArrayList mList) { super(); this.mContext = mContext; this.mList = mList; } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder; final int index=position; if (convertView == null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate( R.layout.lcd_userlist_item, null); viewHolder.t1=convertView.findViewById(R.id.con_username); viewHolder.bt1 = convertView.findViewById(R.id.deleteuser); viewHolder.bt2 = convertView.findViewById(R.id.edituser); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } // 用bean 来填充数据 viewHolder.t1.setText(mList.get(index).toString()); viewHolder.bt1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.out.println("删除按钮被点击了位置是"+index); DatabaseHelper dbHelper=new DatabaseHelper(mContext,"UserList",null,1); SQLiteDatabase db=dbHelper.getWritableDatabase(); db.execSQL("delete from userlist where username="+mList.get(index).toString()); db.close(); viewHolder.bt1.setEnabled(false); } }); viewHolder.bt2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.out.println("编辑按钮被点击了位置是"+index); } }); return convertView; } final static class ViewHolder { TextView t1; Button bt1, bt2; }
上一大坨代码恶心一下。如果是5月份的我可能看不懂,但是现在不一样了。这个适配器用来接收listview 的数据 把他填充到listview里面的itemview里面。这不就是一个适配的过程吗。你的数据有很多,但是可以再listview里面展示出来。
在代码里面就是这样写的
接上面的代码,holder是什么。这段代码其实是我从网上找的,但是用的时候我只知道填代码填数据。为什么要用holder因为功能要求点击按钮删除这个用户。找来找去用holder可以监听每一个item的按钮。后面看了第一行代码以后我才知道holder可以用来缓存对象,提高listview的性能不用每次都去findviewbyid。我可以说是安卓特色吗?恰好holder还可以帮我实现监听功能。
2.命令模式。例子:handler
在实现子线程刷新ui的办法中,安卓给我们提供了handler和message和looper
当然还有
这个地方会提示
解决办法:弱引用。这里不想改了。具体操作百度有。多说跑题
还有很多问题,代码非常粗糙 如果有想帮新手修改bug或者优化的 可以去我的牛客网找一找下载代码修改
既然重新回顾一下这个问题,我的解决办法:
我用的是静态公有变量timerstr表示播放时间。
这里会涉及到多线程。如果你切换歌曲的时候,timer没有取消 就会让你的那个时间条跳起来看起来很滑稽。 我在使用timer之前都会取消掉它。
基本上是遇到问题,百度解决问题
回到正文:
这里就是在子线程里面控制播放进度。用这个安卓给我们的命令模式实现刷新ui。比较简单。菜鸟教程写的不错我也搬运一下。https://www.runoob.com/design-pattern/command-pattern.html
命令模式总结:数据驱动!
篇幅有点长,这一篇回顾了结合自己写过的代码 分析安卓用到的适配器模式和命令模式的地方。