注意,我要放大招了!!哈哈哈哈,开玩笑啦~
最近一直被回调接口折磨的欲生欲死的,网上看了很多例子,还是不明白有什么作用,最后逼不得已请教了一个朋友(其实我是想自己想明白的 0 0),在博客上整理一下思路,以供日后脑子不好使的时候回忆。
首先了解一下接口的含义:
接口回调在android中一般是使用在数据的交互上(我是一般这样的,不对的请大神指教),比如你在Activity-A(下面简称A)中定义了一个接口,如下
public interface Callback
{
void send();
}
然后在A中定义了一个获取获取接口的类
private Callback callback;
public void setCallBack(Callback callBack){
this.callback=callBack;
}
然后在Activity–B中进行注册监听,即implements Callback这个接口,覆写send()的方法,进行你自己的相关操作,操作完成后,callback回调回Activity-A这个页面再进行相关操作,最终回调完成,可能我讲的不清楚,看代码吧,简单粗暴。
下面是代码是实现主Activity中进行异步动态更新listview的过程,注意:onPostExcute()本身在UI进行操作的,但是我使用接口回调的方法进行更新:
public class QiushibaikeAsyncTask extends AsyncTask<String, Void, List<Map<String,Object>>> {
//定义接口变量
private CallBack callback;
//构造函数中传入接口
public QiushibaikeAsyncTask(CallBack callback)
{
this.callback=callback;
}
@Override
protected List<Map<String,Object>> doInBackground(String... params) {
// TODO Auto-generated method stub
String str = HttpUtil.getString(params[0]);
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
list = ParseJsonString.fromStringToList(str);
return list;
}
@Override
protected void onPostExecute(List<Map<String,Object>> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
//发送结果
callback.send(result);
}
//定义接口
public interface CallBack
{
public void send(List<Map<String,Object>> result);
}
}
主Activity
public class MainActivity extends Activity {
private ListView lv;
// 集合数据
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 自定义适配器
MyAdapter adapter;
private RelativeLayout layout;
// 页码变量
int curPage = 1;
int sumPage = Integer.MAX_VALUE;// 假设
// 判断是否到达底部
boolean isBottom = false;
String path = "http://m2.qiushibaike.com/article/list/suggest?page=";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
layout = (RelativeLayout) findViewById(R.id.layout);
// 创建适配器对象
adapter = new MyAdapter(MainActivity.this, list, lv);
// 开启异步任务
QiushibaikeAsyncTask qiushi = new QiushibaikeAsyncTask(new CallBack() {
@Override
public void send(List<Map<String, Object>> result) {
// TODO Auto-generated method stub
//进行页面刷新操作
list.addAll(result);
adapter.notifyDataSetChanged();
lv.setAdapter(adapter);
}
});
qiushi.execute(path + curPage);
// ListView 的滚动事件
lv.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_FLING:
break;
case SCROLL_STATE_IDLE:
if (isBottom) {
if(curPage<sumPage)
{
layout.setVisibility(View.VISIBLE);
// 重新加载下页数据
curPage++;
// 开启异步任务下载内容
new QiushibaikeAsyncTask(new CallBack() {
@Override
public void send(List<Map<String, Object>> result) {
if (result.size() == 0) {
sumPage = curPage;
return;
}
// 将result值添加到list
list.addAll(result);
adapter.notifyDataSetChanged();
}
}).execute(path + curPage);
// 将isBottom设置成false
isBottom = false;
}
}
break;
case SCROLL_STATE_TOUCH_SCROLL:
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// 判断是否到达底部
if (firstVisibleItem + visibleItemCount == totalItemCount) {
isBottom = true;
} else {
isBottom = false;
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}