java handler是什么?java 中为什么要引入handler这种设计方法
今天给各位分享java handler是什么的知识,其中也会对java 中为什么要引入handler这种设计方法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
在c#程序设计里 Handler 这个词一般会翻译成什么
这个怎么翻译,应该不重要吧...
...
晓得意思,怎么用就可以了呀...
..
这个一般是在
KeyPress事件中的参数
KeyPressEventArgs
e
所具有的参数,e.Handler
可以将它的值设为
true或false
当e.Handler=true的时候,就是阻止用户输入,为false就是允许用户输入。要是硬要翻译的话,可以把他联系事件翻译成:输入事件的控制者吧...
...
java 中为什么要引入handler这种设计方法
代码的目的是满足需求,操作方便自然就写了,无论handler还是controller,都是为了实现需求,但当出现大量handler的时候,说明这个程序员啥都不懂,连命名都不会了,命名成XXService、XXDao等,至少从代码上可以看出层次看出功能,便于后期维护
如果这是项目经理写的,只能说明他画虎不成反类犬,很不可取,千万别跟他学
Python中的logger和handler到底是个什么鬼
最近的任务经常涉及到日志的记录,特意去又学了一遍logging的记录方法。跟java一样,python的日志记录也是比较繁琐的一件事,在写一条记录之前,要写好多东西。典型的日志记录的步骤是这样的:
创建logger
创建handler
定义formatter
给handler添加formatter
给logger添加handler
写成代码差不多就是酱婶的(这个是照别的网页抄的,参考附注):
1 import logging2 3# 1、创建一个logger 4 logger= logging.getLogger('mylogger')
5 logger.setLevel(logging.DEBUG)
6 7# 2、创建一个handler,用于写入日志文件 8 fh= logging.FileHandler('test.log')
9 fh.setLevel(logging.DEBUG)
10 11#再创建一个handler,用于输出到控制台 12 ch= logging.StreamHandler()
13 ch.setLevel(logging.DEBUG)
14 15# 3、定义handler的输出格式(formatter)16 formatter= logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
17 18# 4、给handler添加formatter19 fh.setFormatter(formatter)
20 ch.setFormatter(formatter)
21 22# 5、给logger添加handler 23 logger.addHandler(fh)
24 logger.addHandler(ch)
之后才可以正式的开始记录日志。Java里面的java.util.Logging类差不多也是这样,代码还要更复杂一点。Golang的日志相对写法简单一些,不过没有什么格式,系统记录一条时间,内容格式完全自己手画。第三方的日志库倒是没有接触过,像Java的Log4j,Golang的log4go和seelog等等,不知道用起来会不会简单一点。我一直都记不住这些,因为不太理解logger和handler为什么要这样写。一直到这次任务中出现的在我看来相当“诡异”的bug,才深入理解了一下。
我的任务是这样的,要做一个日志切割的工具,按天将日志分割开,即每天0点产生一个新日志,将旧日志改名。并且,将超过3个月的日志删除掉,以保证磁盘空间不会被log占满。程序要求可以切割多个目录中的不同日志,具体路径由json中配置。
这里用到了logging.handlers类中的TimedRotatingFileHandler方法,用以获得一个handler。大概的写法为:
1 logger= logging.getLogger()#获得logger2 handler= logging.handlers.TimedRotatingFileHandler(logfile,'S', 1, 0)#切割日志3 handler.suffix='%Y%m%d'#切割后的日志设置后缀4 logger.addHandler(handler)#把logger添加上handler5 logger.fatal(datetime.datetime.now().strftime('%Y-%m-%d'))#在新日志中写上当天的日期这里我没有设置level和formatter。因为只是分割,对新日志没有什么影响。TimedRotatingFileHandler函数的方法见附注,或查看python的源码,这个函数是python写的,可以找到定义。这里我使用的是每秒生成一个新的日志文件,之后用Crontab在每天0点调度,然后用for循环处理json中的每一个日志文件。
但是奇怪的是,每次运行程序,第一个切割的日志生成一个分割后的文件,而后面的都生成两个新日志。百思不得其解。后检查代码觉得,可能是程序中设置的时间太短了,每秒生成一个文件,有可能一秒钟处理不完,就生成了两个。虽然这个说法没有什么科学根据,但是还是把TimedRotatingFileHandler中的第三个参数改成了60,即每60秒生成一个文件。完成,静静的等待crontab到时间。
叮!时间到。赶紧检查一下结果。一个好消息和一个坏消息。好消息是这次每个日志都只切割生成了一个新文件,没有生成两个。坏消息是每个文件里面添加的当天的日期的数量见鬼了。我切割了4条日志,生成的新日志里面就分别写上了一、二、三、四行当天日期。
此刻我的内心几乎是崩溃的。我开始思考为什么会这样。很明显四行日期是调用了4次logger.fatal('datetime.datetime.now().strftime('%Y-%m-%d'))这个函数。换句话说,我每一次for循环都在这个log里面写了一句话。可是明明每个for是处理一个日志,下一次for应该是处理下一个日志的,为什么会再处理这个日志一次?我突然想到,logger.addHandler(handler)是每次循环都会运行的,也就是说,logger是同一个logger,添加了4次handler。到第4次循环的时候,这个logger中有4个handler,也就会往4个不同的日志中添加内容了。呃。
如果是这样的话,那么把上面的程序改改,第一句和最后一句放在循环外,循环内只用中间的三句。这次OK了。回头再看log记录的步骤,也就明白了logger和handler到底是个什么鬼:logger可以看做是一个记录日志的人,对于记录的每个日志,他需要有一套规则,比如记录的格式(formatter),等级(level)等等,这个规则就是handler。使用logger.addHandler(handler)添加多个规则,就可以让一个logger记录多个日志。至于logging.getLogger()方法获得的root logger和继承关系,可以详见附注的网页,这里我也只是大概明白了什么意思,还没有具体用过。也许将来在框架中使用,要记录较为复杂的日志时候会用到吧。
rxjava能代替handler吗
RxJava好在哪换句话说,『同样是做异步,为什么人们用它,而不用现成的AsyncTask/Handler/XXX/?』一个词:简洁。异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。Android创造的AsyncTask和Handler,其实都是为了让异步代码更加简洁。RxJava的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。假设有这样一个需求:界面上有一个自定义的视图imageCollectorView,它的作用是显示多张图片,并能使用addImage(Bitmap)方法来任意增加显示的图片。现在需要程序将一个给出的目录数组File[]folders中每个目录下的png图片都加载出来并显示在imageCollectorView中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在UI线程执行。常用的实现方式有多种,我这里贴出其中一种:newThread(){@Overridepublicvoidrun(){super.run();for(Filefolder:folders){File[]files=folder.listFiles();for(Filefile:files){if(file.getName().endsWith(".png")){finalBitmapbitmap=getBitmapFromFile(file);getActivity().runOnUiThread(newRunnable(){@Overridepublicvoidrun(){imageCollectorView.addImage(bitmap);}});}}}}}.start();而如果使用RxJava,实现方式是这样的:Observable.from(folders).flatMap(newFunc1>(){@OverridepublicObservablecall(Filefile){returnObservable.from(file.listFiles());}}).filter(newFunc1(){@OverridepublicBooleancall(Filefile){returnfile.getName().endsWith(".png");}}).map(newFunc1(){@OverridepublicBitmapcall(Filefile){returngetBitmapFromFile(file);}}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(newAction1(){@Overridepublicvoidcall(Bitmapbitmap){imageCollectorView.addImage(bitmap);}});那位说话了:『你这代码明明变多了啊!简洁个毛啊!』大兄弟你消消气,我说的是逻辑的简洁,不是单纯的代码量少(逻辑简洁才是提升读写代码速度的必杀技对不?)。观察一下你会发现,RxJava的这个实现,是一条从上到下的链式调用,没有任何嵌套,这在逻辑的简洁性上是具有优势的。当需求变得复杂时,这种优势将更加明显(试想如果还要求只选取前10张图片,常规方式要怎么?如果有这样那样的要求呢?再试想,在这一大堆需求实现完两个月之后需要改功能,当你翻回这里看到自己当初写下的那一片迷之缩进,你能保证自己将迅速看懂,而不是对着代码重新捋一遍思路?)。另外,如果你的IDE是AndroidStudio,其实每次打开某个Java文件的时候,你会看到被自动Lambda化的预览,这将让你更加清晰地看到程序逻辑:Observable.from(folders).flatMap((Func1)(folder)->{Observable.from(file.listFiles())}).filter((Func1)(file)->{file.getName().endsWith(".png")}).map((Func1)(file)->{getBitmapFromFile(file)}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe((Action1)(bitmap)->{imageCollectorView.addImage(bitmap)});如果你习惯使用Retrolambda,你也可以直接把代码写成上面这种简洁的形式。而如果你看到这里还不知道什么是Retrolambda,我不建议你现在就去学习它。原因有两点:1.Lambda是把双刃剑,它让你的代码简洁的同时,降低了代码的可读性,因此同时学习RxJava和Retrolambda可能会让你忽略RxJava的一些技术细节;2.Retrolambda是Java6/7对Lambda表达式的非官方兼容方案,它的向后兼容性和稳定性是无法保障的,因此对于企业项目,使用Retrolambda是有风险的。所以,与很多RxJava的推广者不同,我并不推荐在学习RxJava的同时一起学习Retrolambda。事实上,我个人虽然很欣赏Retrolambda,但我从来不用它。
关于java handler是什么和java 中为什么要引入handler这种设计方法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。