今天看了Google官方对Accessing contacts data这部分的介绍,感觉我们在使用getLoaderManager().initLoader(0, null, this);时候,会在本类一般是view层的类里面实现参数三的接口,不过这里感觉没有将视图与数据分开,虽然initLoader是一个异步操作,使用继承asyncTaskLoader来查询联系人,这个我还是想将他包装一下,放到control层里面,也就是说写一个control类来做数据的查询,这个类不需要继承AsyncTask,因为仅仅做一个包装而已,内部initLoader是异步加载的
上代码:
getLoaderManager().initLoader(0, null, new AsyncLoaderContacts(this,new AsyncLoaderContacts.OnSendCursor() {
@Override
public void sendCursor(ArrayList<SortModel> SourceDateList) {
// TODO Auto-generated method stub
HomeFragment_Contacts.this.SourceDateList=SourceDateList;//这是一个数据复制,在查询结束回调时候使用
getDatas(); //这里处理查询到的数据,方法定义在view类里面
}
}));
这里我们写了一个AsyncLoaderContacts来替代view需要实现的接口,并且自定义一个接口用于回调,话说这个回调接口我可是花了好久才理解该怎么用的
关于AsyncLoaderContacts主要代码如下
public class AsyncLoaderContacts implements LoaderCallbacks<Cursor>{
WeakReference<Context> weakref= null;
OnSendCursor osc=null;
public AsyncLoaderContacts(Context context,OnSendCursor onSendCursor)
{
weakref=new WeakReference<Context>(context);
this.osc=onSendCursor;
}
public final static String P_Name=ContactsContract.Contacts.DISPLAY_NAME;
public final static String P_Number=ContactsContract.CommonDataKinds.Phone.NUMBER;
static String[] selections=new String[]{ContactsContract.Contacts._ID,P_Name,P_Number};
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// TODO Auto-generated method stub
if(weakref.get()!=null)
return new CursorLoader(weakref.get(), ContactsContract.CommonDataKinds.Phone.CONTENT_URI, selections, null, null, null);
else
return null;
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// TODO Auto-generated method stub
}
public interface OnSendCursor{
public abstract void sendCursor(ArrayList<SortModel> sourcelist);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// TODO Auto-generated method stub
ArrayList<SortModel> adapter_datas=new ArrayList<SortModel>();
data.moveToFirst();
while(!data.isAfterLast())
{
SortModel idatas=new SortModel();
idatas.setName(data.getString(data.getColumnIndex(P_Name)));
idatas.setPhone(data.getString(data.getColumnIndex(P_Number)));
adapter_datas.add(idatas);
data.moveToNext();
}
if(this.osc!=null) //回调函数,在View层里面处理
osc.sendCursor(DateFilter.filledData(adapter_datas)); //参数主要是我想对数据的处理
}
}
这里面有个WeakReference是我在官方一步加载图片的时候看到的,他讲的是在主线程之外引用主线程内部的东西最好使用WeakReference,因为考虑到万一APP 销毁,而持有该APP的其他线程还保持着强引用,那么会导致内存泄露,所以用WeakReference最好了,不知道虚引用的百度哦~~这可是JAVA基础,其实我也是百度才知道的-w-,不过现在会用了
总结下来,这次主要是熟悉了回调函数,对WeakReference使用的方法,这里貌似不是额外的线程,没必要使用WeakReference,不过没关系啦,假装继承的是AsyncTask来加载数据嘛
吐槽一下.其实上面只是一个使用回调函数与异步加载的思想,只要理解这样的分层设计,话说这MVC我还不是很懂,不过我觉得就是将View与data分离嘛~
学android,我倒是觉得看视频,书籍什么的都不行,学校的书籍千篇一律,大多数就是讲的基础,将Google的文档基础部分翻译一点就出书了,还说自己的版权,不如多逛逛人家的博客,最好就是看Google官方文档了,理解他的设计理念和设计方法,大多数都能为自己所用,当然了,也不是绝对的好,只有真正理解之后才能改进,可能说的有点过分啦,不过这只是我个人的想法罢了哦