android回调的理解------异步任务回调接口

来源:互联网 发布:现在做淘宝还有前景吗 编辑:程序博客网 时间:2024/05/16 12:01

注意,我要放大招了!!哈哈哈哈,开玩笑啦~
最近一直被回调接口折磨的欲生欲死的,网上看了很多例子,还是不明白有什么作用,最后逼不得已请教了一个朋友(其实我是想自己想明白的 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;    }}
0 0