关键字过滤器Filter

publicabstractclass
Filter
extendsObject
java.lang.Object
android.widget.Filter
ClassOverview
关键字过滤器android.widget.Filterconstrainsdatawithafilteringpattern.
FiltersareusuallycreatedbyFilterableclasses.
Filteringoperationsperformedbycalling
filter(CharSequence)orfilter(CharSequence,android.widget.Filter.FilterListener)areperformedasynchronously.
Whenthesemethodsarecalled,afilteringrequestispostedinarequestqueueandprocessedlater.
Anycalltooneofthesemethodswillcancelanypreviousnon-executedfilteringrequest.

注意1:Filter是个虚类。系统并没对外提供了的Filter类的实现,它只是内部实现了一些Filter类。Filter应该在UI线程中被创建。
注意2:Filter是对外提供filter(CharSequence)orfilter(CharSequence,android.widget.Filter.FilterListener)来进行过滤。而且这两个函数是异步的。在调用这两个方法后,以前还未执行的过滤命令(它也通过调用者两个函数)将被取消。
主要函数
publicCharSequenceconvertResultToString(ObjectresultValue)
Since:APILevel1
ConvertsavaluefromthefilteredsetintoaCharSequence.Subclassesshouldoverridethismethodtoconverttheirresults.ThedefaultimplementationreturnsanemptyStringfornullvaluesorthedefaultStringrepresentationofthevalue.
Parameters
resultValuethevaluetoconverttoaCharSequence
Returns

*aCharSequencerepresentingthevalue
注1:该函数就是提供了把结果转化成字符串的功能。子类可以重载它。
publicfinalvoidfilter(CharSequenceconstraint,Filter.FilterListenerlistener)
Since:APILevel1

Startsanasynchronousfilteringoperation.Callingthismethodcancelsallpreviousnon-executedfilteringrequestsandpostsanewfilteringrequestthatwillbeexecutedlater.

Uponcompletion,thelistenerisnotified.
Parameters
constrainttheconstraintusedtofilterthedata
listeneralistenernotifieduponcompletionoftheoperation
注1:constraint是过滤的关键字。
注2:listener就是在过滤操作的一个监听器。当过滤完成时调用listeneronFilterComplete(intcount)。这里的count表示查询到的数据项的数量。
publicfinalvoidfilter(CharSequenceconstraint)
Since:APILevel1

Startsanasynchronousfilteringoperation.Callingthismethodcancelsallpreviousnon-executedfilteringrequestsandpostsanewfilteringrequestthatwillbeexecutedlater.
Parameters
constrainttheconstraintusedtofilterthedata
注1:constraint是过滤的关键字。
Protected的且需要实现的方法:
protectedabstractFilter.FilterResultsperformFiltering(CharSequenceconstraint)
Since:APILevel1
Invokedinaworkerthreadtofilterthedataaccordingtotheconstraint.Subclassesmustimplementthismethodtoperformthefilteringoperation.ResultscomputedbythefilteringoperationmustbereturnedasaFilter.FilterResultsthatwillthenbepublishedintheUIthreadthroughpublishResults(CharSequence,android.widget.Filter.FilterResults).
Contract:Whentheconstraintisnull,theoriginaldatamustberestored.
参数
constrainttheconstraintusedtofilterthedata
Returns

*theresultsofthefilteringoperation
注1:该方法是个虚方法。
注2:该方法是在一个工作线程中执行的。它的任务就是根据关键字constraint来返回数据和数据的个数。
它们分别对应于Filter.FilterResults的成员变量publicintcountpublicObjectvalues

protectedabstractvoidpublishResults(CharSequenceconstraint,Filter.FilterResultsresults)
Since:APILevel1

InvokedintheUIthreadtopublishthefilteringresultsintheuserinterface.SubclassesmustimplementthismethodtodisplaytheresultscomputedinperformFiltering(CharSequence).
参数
constrainttheconstraintusedtofilterthedata
resultstheresultsofthefilteringoperation
注1:该方法是虚方法。并且该方法是在创建Filter的线程中被执行,它一般用来做些UI方面的操作。如果Filter应该在UI线程中被创建,那么该函数就是UIthread中被执行了。
注意1:关于的实现可以参考CursorFilter。
Filter的源码摘要如下:
http://hi-android.info/src/android/widget/Filter.java.html
packageandroid.widget;
publicabstractclassFilter{
privatestaticfinalStringLOG_TAG="Filter";

privatestaticfinalStringTHREAD_NAME="Filter";
privatestaticfinalintFILTER_TOKEN=0xD0D0F00D;
privatestaticfinalintFINISH_TOKEN=0xDEADBEEF;

privateHandlermThreadHandler;
privateHandlermResultHandler;

privateDelayermDelayer;

privatefinalObjectmLock=newObject();

/**
*<p>Createsanewasynchronousfilter.</p>
*/

publicFilter(){
mResultHandler=newResultsHandler();
}

-----------------------------------省略----------------------------------------------------------
publicvoidsetDelayer(Delayerdelayer){
synchronized(mLock){
mDelayer=delayer;
}
}
-----------------------------------省略----------------------------------------------------------
publicfinalvoidfilter(CharSequenceconstraint){
filter(constraint,null);
}
-----------------------------------省略----------------------------------------------------------
publicfinalvoidfilter(CharSequenceconstraint,FilterListenerlistener){
synchronized(mLock){
if(mThreadHandler==null){
HandlerThreadthread=newHandlerThread(
THREAD_NAME,android.os.Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mThreadHandler=newRequestHandler(thread.getLooper());
}

finallongdelay=(mDelayer==null)?0:mDelayer.getPostingDelay(constraint);

Messagemessage=mThreadHandler.obtainMessage(FILTER_TOKEN);

RequestArgumentsargs=newRequestArguments();
//makesureweuseanimmutablecopyoftheconstraint,sothat
//itdoesn'tchangewhilethefilteroperationisinprogress

args.constraint=constraint!=null?constraint.toString():null;
args.listener=listener;
message.obj=args;

mThreadHandler.removeMessages(FILTER_TOKEN);
mThreadHandler.removeMessages(FINISH_TOKEN);
mThreadHandler.sendMessageDelayed(message,delay);
}
}
-----------------------------------省略----------------------------------------------------------
protectedabstractFilterResultsperformFiltering(CharSequenceconstraint);
-----------------------------------省略----------------------------------------------------------
protectedabstractvoidpublishResults(CharSequenceconstraint,
FilterResultsresults);
-----------------------------------省略----------------------------------------------------------
publicCharSequenceconvertResultToString(ObjectresultValue){
returnresultValue==null?"":resultValue.toString();
}
-----------------------------------省略----------------------------------------------------------
protectedstaticclassFilterResults{
-----------------------------------省略----------------------------------------------------------
publicObjectvalues;
-----------------------------------省略----------------------------------------------------------
publicintcount;
}
-----------------------------------省略----------------------------------------------------------
publicstaticinterfaceFilterListener{
-----------------------------------省略----------------------------------------------------------
publicvoidonFilterComplete(intcount);
}
-----------------------------------省略----------------------------------------------------------
privateclassRequestHandlerextendsHandler{
publicRequestHandler(Looperlooper){
super(looper);
}
-----------------------------------省略----------------------------------------------------------
publicvoidhandleMessage(Messagemsg){
intwhat=msg.what;
Messagemessage;
switch(what){
caseFILTER_TOKEN:
RequestArgumentsargs=(RequestArguments)msg.obj;
try{
args.results=performFiltering(args.constraint);
}catch(Exceptione){
args.results=newFilterResults();
Log.w(LOG_TAG,"AnexceptionoccuredduringperformFiltering()!",e);
}finally{
message=mResultHandler.obtainMessage(what);
message.obj=args;
message.sendToTarget();

}

synchronized(mLock){
if(mThreadHandler!=null){
MessagefinishMessage=mThreadHandler.obtainMessage(FINISH_TOKEN);
mThreadHandler.sendMessageDelayed(finishMessage,3000);
}
}
break;
caseFINISH_TOKEN:
synchronized(mLock){
if(mThreadHandler!=null){
mThreadHandler.getLooper().quit();
mThreadHandler=null;
}
}
break;
}
}
}

/**
*<p>Handlestheresultsofafilteringoperation.Theresultsare
*handledintheUIthread.</p>
*/

privateclassResultsHandlerextendsHandler{
/**
*<p>Messagesreceivedfromtherequesthandlerareprocessedinthe
*UIthread.Theprocessinginvolvescalling
*{@linkFilter#publishResults(CharSequence,
*android.widget.Filter.FilterResults)}
*toposttheresultsbackintheUIandthennotifyingthelistener,
*ifany.</p>
*
*@parammsgthefilteringresults
*/

@Override
publicvoidhandleMessage(Messagemsg){
RequestArgumentsargs=(RequestArguments)msg.obj;

publishResults(args.constraint,args.results);
if(args.listener!=null){
intcount=args.results!=null?args.results.count:-1;
args.listener.onFilterComplete(count);
}
}
}
-----------------------------------省略----------------------------------------------------------
privatestaticclassRequestArguments{
/**
*<p>Theconstraintusedtofilterthedata.</p>
*/

CharSequenceconstraint;

/**
*<p>Thelistenertonotifyuponcompletion.Canbenull.</p>
*/

FilterListenerlistener;

/**
*<p>Theresultsofthefilteringoperation.</p>
*/

FilterResultsresults;
}

/**
*@hide
*/
publicinterfaceDelayer{

/**
*@paramconstraintTheconstraintpassedto{@linkFilter#filter(CharSequence)}
*@returnThedelaythatshouldbeusedfor
*{@linkHandler#sendMessageDelayed(android.os.Message,long)}
*/

longgetPostingDelay(CharSequenceconstraint);
}
}
注意:如果在完成一个过滤任何后,3000毫秒的时间内没有新的过滤任务请求的话,mThreadHandler会消亡。
在新的过滤任务到来时如果mThreadHandler已经消亡,那么就重新创建一个新的mThreadHandler。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值