当前位置: 首页 > news >正文

传奇做网站空间佛山做外贸网站如何

传奇做网站空间,佛山做外贸网站如何,深圳企业做网站公司有哪些,wordpress的模板前言最近一直在想着能否有一种更好的方案来解决#xff1a;Android中Activity与Fragment之间通信的问题#xff0c;什么叫更好呢#xff0c;就是能让Fragment的复用性高#xff0c;性能还有好(不用反射)#xff0c;代码还要好维护#xff0c;不需要为每对Activity和Fragm…前言最近一直在想着能否有一种更好的方案来解决Android中Activity与Fragment之间通信的问题什么叫更好呢就是能让Fragment的复用性高性能还有好(不用反射)代码还要好维护不需要为每对Activity和Fragment之间定义接口而发愁。先简单说下Javascript这门语言吧或许有人就会问咱们不是聊Android的java问题吗怎么话题转到JavaScript了。因为我的解决方案的启发是从它来的没兴趣的朋友可以略过。最近在学习javascript这门语言同时自己搞Android(java)开发也有5年多时间了所以在学习js的过程中就会惯性的把这两者进行比较。与java语言的 严谨 相比 Javascript是一门放荡不羁、不拘小节(宽泛)的语言。为什么要用放荡不羁这个词呢下面是它的一个解释放荡不羁 [fàng dàng bù jī][解释] 羁:约束。放纵任性不加检点不受约束。因为我觉得这个词更能充分的体现js弱类型的特点。在给变量赋值时 可以这样写:var a 1;还可以这样写:var b 123;var o new Object();甚至还可以这样写:var fun new function(){};fun1 new function(){};可以把任何类型的值赋给一个变量也可以不加var关键字来声明一个变量是不是很任性很不拘束啊。不拘小节主要体现了JavaScript的语法更宽泛、更简单的特点: 比如js代码://函数声明不需要定义返回值参数前面不需要有类型出现//函数体里面就可以有返回值function max(a,b){ return a b? a:b; }/* *可以传递任意多个参数在java里面根本不可以 */function print(){var len arguments.length;for(var i 0; i len; i){console.log(arguments[i]);}}相应java代码:int max(int a, int b){return a b? a:b;}/* *传递任意多个Object类型的参数 */void print(Object... args){for (int i 0; i args.length; i){System.out.println(args[i]);}}上面的代码说明了JavaScript在声明函数时不会有像java那么严格的规定语法不拘小节语法更简单(这里没有说java不好的意思)。启发点JavaScript中有一个重要的点(万事万物皆对象)函数也不列外并且函数可以作为另外一个函数的参数如:js代码//遍历一个数组如果是它是数组就把它乘以10再输出var array [1,2, 你好 , 不 ,31,15];//数组的each方法接收一个函数testArray.each( function( value ){typeof value number ? alert( value *10 ):null;}) ;当我看到上面JavaScript中函数的用法时我眼前一亮为啥我不可以借鉴之来解决android中activity与fragment通信的问题呢Fragment的使命先让我们聊聊Fragment为什么出现这对于我们解决Activity与Fragment的通信有帮助。一个新事物的产生总是为了解决旧事物存在的问题Fragment是android3.0的产物在android3.0之前解决手机、平板电脑的适配问题是很头疼的对ActivityGroup有印象的朋友应该能深深的体会到ActivityGroup包裹的多个Activity之间切换等一系列的性能问题。由此Fragment诞生了。个人总结的Fragment的使命解决手机、平板电脑等各种设备的适配问题解决多个Activity之间切换性能问题模块化因为模块化导致复用的好处Fragment的使用Fragment是可以被包裹在多个不同Activity内的同时一个Activity内可以包裹多个FragmentActivity就如一个大的容器它可以管理多个Fragment。所有Activity与Fragment之间存在依赖关系。Activity与Fragment通信方案上文提到Activity与Fragment之间是存在依赖关系的因此它们之间必然会涉及到通信问题解决通信问题必然会涉及到对象之间的引用。因为Fragment的出现有一个重要的使命就是模块化从而提高复用性。若达到此效果Fragment必须做到高内聚低耦合。现在大家动动脚趾都能想到的解决它们之间通信的方案有handler广播EvnetBus接口等(或许还有别的方案请大家多多分享)那我们就聊下这些方案。handler方案:先上代码public class MainActivity extends FragmentActivity{//声明一个Handlerpublic Handler mHandler new Handler(){Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);...相应的处理代码}}...相应的处理代码}public class MainFragment extends Fragment{//保存Activity传递的handlerprivate Handler mHandler;Overridepublic void onAttach(Activity activity) {super.onAttach(activity);//这个地方已经产生了耦合若还有其他的activity这个地方就得修改if(activity instance MainActivity){mHandler ((MainActivity)activity).mHandler;}}...相应的处理代码}该方案存在的缺点Fragment对具体的Activity存在耦合不利于Fragment复用不利于维护若想删除相应的ActivityFragment也得改动没法获取Activity的返回数据handler的使用个人感觉就很不爽(不知大家是否有同感)广播方案具体的代码就不写了说下该方案的缺点用广播解决此问题有点大材小用了个人感觉广播的意图是用在一对多接收广播者是未知的情况广播性能肯定会差(不要和我说性能不是问题对于手机来说性能是大问题)传播数据有限制(必须得实现序列化接口才可以)暂时就想到这些缺点其他的缺点请大家集思广益下吧。EventBus方案具体的EventBus的使用可以自己搜索下个人对该方案的看法EventBus是用反射机制实现的性能上会有问题(不要和我说性能不是问题对于手机来说性能是大问题)EventBus难于维护代码没法获取Activity的返回数据接口方案我想这种方案是大家最易想到使用最多的一种方案吧具体上代码//MainActivity实现MainFragment开放的接口public class MainActivity extends FragmentActivity implements FragmentListener{overridepublic void toH5Page(){ }...其他处理代码省略}public class MainFragment extends Fragment{public FragmentListener mListener;//MainFragment开放的接口public static interface FragmentListener{//跳到h5页面void toH5Page();}Overridepublic void onAttach(Activity activity) {super.onAttach(activity);//对传递进来的Activity进行接口转换if(activity instance FragmentListener){mListener ((FragmentListener)activity);}}...其他处理代码省略}这种方案应该是既能达到复用又能达到很好的可维护性并且性能也是杠杠的。但是唯一的一个遗憾是假如项目很大了Activity与Fragment的数量也会增加这时候为每对Activity与Fragment交互定义交互接口就是一个很头疼的问题(包括为接口的命名新定义的接口相应的Activity还得实现相应的Fragment还得进行强制转换)。 想看更好的解决方案请看下面章节。大招来也设计模式里经常提到的一个概念就是封装变化同时受javascript中的函数的参数可以是函数对象的启发下我有了下面的想法先上代码代码地址/** * Created by niuxiaowei on 2016/1/20.* 各种方法集合的类可以把一个方法类以key-value的形式放入本类* 可以通过key值来调用相应的方法 */public class Functions {//带参数方法的集合key值为方法的名字private HashMap mFunctionWithParam ;//无参数无返回值的方法集合同理key值为方法名字private HashMap mFunctionNoParamAndResult ;/** * 基础方法类 */public static abstract class Function{//方法的名字用来做调用也可以理解为方法的指针public String mFunctionName;public Function(String functionName){this.mFunctionName functionName;}}/** * 带有参数没有返回值的方法* param 参数 */public static abstract class FunctionWithParam extends Function{public FunctionWithParam(String functionName) {super(functionName);}public abstract void function(Param param);}/** * 没有参数和返回值的方法 */public static abstract class FunctionNoParamAndResult extends Function{public FunctionNoParamAndResult(String functionName) {super(functionName);}public abstract void function();}/** * 添加带参数的函数* param function {link com.niu.myapp.myapp.view.util.Functions.FunctionWithParam}* return */public Functions addFunction(FunctionWithParam function){if(function null){return this;}if(mFunctionWithParam null){mFunctionWithParam new HashMap(1);}mFunctionWithParam.put(function.mFunctionName,function);return this;}/** * 添加带返回值的函数* param function {link com.niu.myapp.myapp.view.util.Functions.FunctionWithResult}* return */public Functions addFunction(FunctionNoParamAndResult function){if(function null){ return this; }if(mFunctionNoParamAndResult null){mFunctionNoParamAndResult new HashMap(1);}mFunctionNoParamAndResult.put(function.mFunctionName,function);return this;}/** * 根据函数名回调无参无返回值的函数* param funcName */public void invokeFunc(String funcName) throws FunctionException {FunctionNoParamAndResult f null;if(mFunctionNoParamAndResult ! null){f mFunctionNoParamAndResult.get(funcName);if(f ! null){ f.function(); }}if(f null){ throw new FunctionException(没有此函数); }}/** * 调用具有参数的函数* param funcName* param param* param */public void invokeFunc(String funcName,Param param)throws FunctionException{FunctionWithParam f null;if(mFunctionWithParam ! null){f mFunctionWithParam.get(funcName);if(f ! null){ f.function(param); }}}}设计思路1. 用一个类来模拟Javascript中的一个FunctionFunction就是此类它是一个基类每个Functioon实例都有一个mFuncName 既然是方法(或者函数)它就有有参数和无参数之分FunctionWithParam是Function的子类代表有参数的方法类方法参数通过泛型解决FunctionNoParamAndResult是Function的子类代表无参无返回值的方法类2. 一个可以存放多个方法(或者函数)的类Functions类就是此类,下面简单介绍下Functions有4个主要方法addFunction(FunctionNoParamAndResult function) 添加一个无参无返回值的方法类addFunction(FunctionWithParam function) 添加一个有参无返回值的方法类invokeFunc(String funcName) 根据funcName调用一个方法invokeFunc(String funcName,Param param) 根据funcName调用有参无返回值的方法类使用举例代码地址每个app都有的基础activity(BaseActivity)public abstract class BaseActivity extends FragmentActivity {/*** 为fragment设置functions具体实现子类来做* param fragmentId */public void setFunctionsForFragment(int fragmentId){}}其中的一个activitypublic class MainActivity extends BaseActivity {Override public void setFunctionsForFragment(int fragmentId) {super.setFunctionsForFragment(fragmentId);switch (fragmentId) {case R.id.fragment_main:FragmentManager fm getSupportFragmentManager();BaseFragment fragment (BaseFragment) fm.findFragmentById(fragmentId);//开始添加functionsfragment.setFunctions(new Functions().addFunction(new Functions.FunctionNoParamAndResult(MainFragment.FUNCTION_NO_PARAM_NO_RESULT) {Overridepublic void function() {Toast.makeText(MainActivity.this, 成功调用无参无返回值方法, Toast.LENGTH_LONG).show();}}).addFunction(new Functions.FunctionWithParam(MainFragment.FUNCTION_HAS_PARAM_NO_RESULT) {Overridepublic void function(Integer o) {Toast.makeText(MainActivity.this, 成功调用有参无返回值方法 参数值 o, Toast.LENGTH_LONG).show(); } }));}}}每个app都会有的基础fragment(BaseFragment)public abstract class BaseFragment extends Fragment {protected BaseActivity mBaseActivity;/** * 函数的集合 */protected Functions mFunctions;/** * activity调用此方法进行设置Functions* param functions */public void setFunctions(Functions functions){this.mFunctions functions;}Overridepublic void onAttach(Activity activity) {super.onAttach(activity);//呼叫activity进行回调方法的设置if(activity instanceof BaseActivity){mBaseActivity (BaseActivity)activity;mBaseActivity.setFunctionsForFragment(getId());}}}MainActivity对应的MainFragmentpublic class MainFragment extends BaseFragment {/** * 没有参数没有返回值的函数 */public static final String FUNCTION_NO_PARAM_NO_RESULT FUNCTION_NO_PARAM_NO_RESULT;/** * 有参数没有返回值的函数 */public static final String FUNCTION_HAS_PARAM_NO_RESULT FUNCTION_HAS_PARAM_NO_RESULT;Overridepublic void onViewCreated(View view, Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);mBut1 (Button) getView().findViewById(R.id.click1);mBut3 (Button) getView().findViewById(R.id.click3);mBut1.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {try {//调用无参无返回值的方法mFunctions.invokeFunc(FUNCTION_NO_PARAM_NO_RESULT);} catch (FunctionException e) {e.printStackTrace();}}});mBut3.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {try {//调用有参无返回值的方法mFunctions.invokeFunc(FUNCTION_HAS_PARAM_NO_RESULT, 100);} catch (FunctionException e) {e.printStackTrace(); }}});}看到这您是不是觉得已经结束了当然是没有了因为还有2个问题没解决。方法返回值和方法接收多个参数的问题。方法返回值的问题上代码代码地址/** * 有返回值没有参数的方法* param */public static abstract class FunctionWithResult extends Function{public FunctionWithResult(String functionName) {super(functionName);}public abstract Result function();}/** * 带有参数和返回值的 方法* param * param */public static abstract class FunctionWithParamAndResult extends Function{public FunctionWithParamAndResult(String functionName) {super(functionName);}public abstract Result function(Param data);}FunctionWithResult无参数有返回值的方法类FunctionWithParamAndResult 有参数也有返回值的方法类在Functions类中定义添加和调用这2种方法类的 相应方法。其次是方法含有多个参数的问题在解决此问题时我想了很多办法(比如怎样引入多个泛型但最终以失败告终希望有看了这篇文章的朋友可以多提下宝贵意见)。然后我就想到了用Bundle来解决多参数的问题把多个参数放到Bundle中但是在往Bundle中塞入数据时得有一个对应的key值生成key值以及记住key值(记住key值是为了从Bundle中取数据)是一个繁琐的事。同时Bundle不能传递非序列化对象。所以就封装了一个FunctionParams类解决以上问题请看类的实现: 代码地址/** * 函数的参数当函数的参数涉及到多个值时可以用此类* 此类使用规则存参数与取参数的顺序必须一致* 比如存参数顺序是new*FunctionParamsBuilder().putString(a).putString(b).putInt(100);*取的顺序也是: functionParams.getString(),*functionParams.getString(), functionParams.getInt(); */public static class FunctionParams {private Bundle mParams new Bundle(1);private int mIndex -1;private Map mObjectParams new HashMap(1);FunctionParams(Bundle mParams,Map mObjectParams){this.mParams mParams;this.mObjectParams mObjectParams;}public Param getObject(Class p){if(mObjectParams null){ return null; }return p.cast(mObjectParams.get((mIndex) )); }/** * 获取int值* return */public int getInt(){if(mParams ! null){return mParams.getInt((mIndex) ); } return 0;}/** * 获取int值* param defalut* return */public int getInt(int defalut){if(mParams ! null){return mParams.getInt((mIndex) );}return defalut;}/** * 获取字符串* param defalut * return */public String getString(String defalut){if(mParams ! null){return mParams.getString((mIndex) );}return defalut;}/** * 获取字符串 * return */public String getString(){if(mParams ! null){return mParams.getString((mIndex) );} return null;}/** * 获取Boolean值* return 默认返回false */public boolean getBoolean(){if(mParams ! null){return mParams.getBoolean((mIndex) );} return false;}/** * 该类用来创建函数参数 */public static class FunctionParamsBuilder{private Bundle mParams ;private int mIndex -1;private Map mObjectParams new HashMap(1);public FunctionParamsBuilder(){ }public FunctionParamsBuilder putInt(int value){if(mParams null){mParams new Bundle(2);}mParams.putInt((mIndex) , value);return this;}public FunctionParamsBuilder putString(String value){if(mParams null){mParams new Bundle(2);}mParams.putString((mIndex) , value);return this;}public FunctionParamsBuilder putBoolean(boolean value){if(mParams null){ mParams new Bundle(2); }mParams.putBoolean((mIndex) , value);return this;}public FunctionParamsBuilder putObject(Object value){if(mObjectParams null){mObjectParams new HashMap(1);}mObjectParams.put((mIndex) , value);return this;}public FunctionParams create(){FunctionParams instance new FunctionParams(mParams,mObjectParams); return instance;}}}FunctionParams封装了取参数的功能比如public Param getObject(Class p){if(mObjectParams null){ return null; }return p.cast(mObjectParams.get((mIndex) ));}取对象参数的功能不需要传人key值只需要传人需要即将取出来的类的Class实例即可FunctionParamsBuilder类看它的名字就知道是用了设计模式里的Builder(构建)模式。该类是用来存放参数的当所有的参数都存放完毕后调用create()方法创建一个FunctionParams对象事物都是有两面性的有缺点就有优点只不过是在某些场合下优点大于缺点还是反之。FunctionParams解决了以上提到的Bundle传递多参数种种不便的问题但同时FunctionParams也有一个缺点就是存参数的顺序与取参数的顺序一定要一致比如//存的顺序 newFunctionParamsBuilder().putString(1).putInt(2).putBoolean(true).create();//取的顺序functionParams.getString();functionParams.getInt();functionParams.getBoolean();但是这种缺点函数的定义来看也不是缺点。Activity与Fragment之间的通信是通过Functions的即把变化的部分封装在Functions是类中Functions起一个桥梁作用。此方案优点Fragment与Activity的耦合性几乎没有性能也好(没用反射)可以从Activity获取返回数据扩展性好(新增加的成对的Activity与Fragment之间的通信只需做以下几步1.新增加Activity只需要覆盖BaseActivity中的 setFunctionsForFragment(int fragmentId) 方法把相应的回调函数加入。2.相应的Fragment定义函数key值即可)总结简单总结为以下几点Fragment的使命Activity与Fragment之间通信的解决方案(handler广播EventBus接口)的优缺点。我自己关于Activity与Fragment之间通信的解决方案(Functions)其实解决的主要是Fragment调用Activity的方案。希望大家能多提宝贵意见多交流。代码地址本人微信704451290本人公众账号
http://wiki.neutronadmin.com/news/150025/

相关文章:

  • 搭建模板seo营销名词解释
  • 网站开发工具排行江西省建设厅教育网站
  • 新浪做网站库存管理系统软件
  • 系统网站怎么做的检测网站是否正常
  • 建一个收费网站 怎么收费成都今晚全部解封
  • 模板网站有哪几类公众号登录超时
  • 大型网站开发用的技术装修平台app
  • 学校网站php源码微信公众平台应用开发
  • 学校网站怎么做优化河南搜索引擎推广公司
  • 最好网站建设WordPress的数据库在哪
  • 营销推广费计入什么科目谷歌排名网站优化
  • 找网站建设需要问什么软件国外有哪些优秀的网站
  • 网站建设中企动力最佳a5公司备案查询网站
  • 网页设计做军事网站的感想南京电子商务网站开发公司
  • 和平东路网站建设施工队找工程
  • 网站单个页面紧张搜索引擎蜘蛛oa手机端
  • 做公司子网站的请示报告常州地区网页制作公司
  • 手机网站怎么优化关键词网站咋做
  • 网站自己做还是用程序四川学校网站建设公
  • 织梦网站怎样做百度主动推送网站建设知识文章
  • 上市公司网站建设评价佛山做外贸网站案例
  • 网站开发存在的问题备案ip 查询网站查询网站查询系统
  • 贵阳国家经济技术开发区门户网站深圳产品设计培训机构
  • 网站建设kaodezhuandroid官网入口
  • 报名网站怎么做猎聘网招聘官方网站
  • 服装工厂做网站的好处网页设计与网站建设期末考试试卷
  • 网站建设费用是多少全国企业信息查询官网系统
  • 哪个网站可以做记录视频wordpress配置qq邮箱
  • 资讯网站域名选购班级网站源码
  • 一树擎天又一个wordpress站点聊城手机网站建设价格