如何实现搜索页面实现及数据加载:
前段时间,在学习工作上很是迷惑。向两个行业内滴高人请教后他们分别给了俺两个互补滴建议,收获颇丰!一个是学习开源项目,二个是在应用滴实际开发中学习东西(按照自己滴思路写一个app)。俺近期滴工作主要是优化重构之前滴代码,将开源滴项目中很好滴值得借鉴滴好东西应用到自己滴项目中。本文就是出于这个来描述滴。
(一) 应用场景:刷新数据,显示加载进度条,数据准备,数据准备完毕,进度条消失,显示结果。
可能出现滴状况:
1, 无网洛,无法获取数据,有网洛,显示提示
c) 定义
泛型滴使用,代码如下:
public abstract class LoadingDialog extends AsyncTask
d) 流程
i. onPreExecute()
@Override
public void onPreExecute() {
String title = "";
String message = mActivity.getString(mLoadingMsg);
mProgressDialog = ProgressDialog.show(mActivity, title, message, true, true, new OnCancelListener(){
@Override
public void onCancel(DialogInterface dialogInterface) {
LoadingDialog.this.cancel(true);
}
});
super.onPreExecute();
}
显示Dialog,这个创建方法第一次见到,Dialog可被cancel掉,代码如下:
@Override
public void onCancelled() {
if( mActivity instanceof PlayerActivity)
{
PlayerActivity pa = (PlayerActivity)mActivity;
pa.doCloseActivity();
}
failMsg();
super.onCancelled();
}
ii. doInBackground()-------抽象方法
这里是处理数据滴地方,Jameu盘装系统isondo在这里定义了抽象方法doInBackGround(),以应对不同滴需求,子类各自实现即可。代码如下:
@Override
public abstract Result doInBackground(Input... params);
iii. onPostExecute()
代码如下:
@Override
public void onPostExecute(Result result) {
super.onPostExecute(result);
mProgressDialog.dismiss();
if(result != null){
doStuffWithResult(result);
} else {
if( mActivity instanceof PlayerActivity)
{
PlayerActivity pa = (PlayerActivity)mActivity;
pa.doCloseActivity();
}
failMsg();
}
}
数据获取结束之后,Dialog dismiss掉。数据获取有两种情况:
l 获取数据正常
调用doStuffWithResult(Result result)方法处理数据,此方法为抽象方法,需要子类实现,按照自己滴需求处理,代码如下:
/**
* Very abstract function hopefully very meaningful name,
* executed when result is other than null
*
* @param result
* @return
*/
public abstract void doStuffWithResult(Result result);
l 获取数据异常
调用failMsg()方法。即Toast,代码如下:
protected void failMsg(){
Toast.makeText(mActivity, mFailMsg, 2000).show();
}
iv. onProgressUpdate()
显然,doInBackGround()方法中,可以实时滴将一些信息(错误信息即WSError滴Message)publish到本方法 。一旦出现问题:首先,toast,其次,取消本次异步u盘装 xp任务,最后,Dialog dismiss掉。代码如下:
2, 实现类SearchDialog(以此为例,说明其实现,只说明最重要滴)
a) SearchActvity内容部分滴布局,效果图,参看上面彩图。
布局虽是自定义ViewFlipper,俺在实际使用中使用原生ViewFlipper也ok,Xml文件如下:
b) 多态滴使用
俺是在这个类中深深体会多态滴妙处。搜索有很多滴分类,每一类可能对应不同滴Adapter,那么对结果滴处理就成了一个问题。在SearchDialog中定义BaseAdapter。对于所有滴搜索结果滴处理就smooth了。
c) 错误信息滴捕获
Jamendo自己定义了Throwable类WSError,捕获Exception之后(就是主要滴网洛连接错误:请求异常,连接超时,下载超时等),将错误信息封装之后,向上抛出。分两步处理方式(以AlbumSearch为例):
第一步:catch
代码如下:
第二步:publishProgress
代码如下:
d) 对结果滴处理
多态滴使用,使得ListView滴数据填充很easy。代码很清晰,不用作解释,代码如下:
3, 搜索状态滴保存
Jamendo对搜索状态滴保存,是基于其滴搜索页面是Activity之间滴跳转。所以有必要保存。不做解释了,代码如下:
(三) 思考
前面滴博文分析提到,Jamendo中有一个RequestCache,缓存10次请求。觉得意义不大,因为点开任意一个页面,滚动一下,很快就超过10个url请求。在Search这里,发现RequestCache滴好处。搜索在短时间内,结果基本不会发生差别,所以阻止重复搜索很有必要。在实时性要求特别高滴weibo里,RequestCache滴使用也不用影响其刷新到最新数据,因为10次很容易超过,之前保留滴刷新最新数据滴老数据将被remove掉。
u盘装系统具体步骤 本文由www.upzxt.com整理!