子线程与主线程通信之AsyncTask

1.AsyncTask 的特点:
a.通过开源框架 Conncurrent(并发的框架) 框架来管理匿名线程 ,该框架是非常成熟框架
b.内部有一个线程池,通过线程池来管理线程
c.假如同一时段要开辟多个子线程,可以排队开辟子线程
d. AsyncTask封装了四个方法,可以很好实现子线程与主线程通信
e.AsyncTask内部也是采用Handler进行通信

2.AsyncTask 的三个泛型参数,四个封装的方法:
三个泛型参数:
(1)Params: 传递过来的参数 : 影响的参数 AsyncTask.execute(params)—>doInBackground(String… params)
(2)Progress: 进度参数 :publishProgress(Integer …values)—–>onProgressUpdate(Integer[] values)
(3)Result : 结果参数 :Uri doInBackground() 返回参数—–>onPostExecute(Uri result) 的输入参数

四个方法:
(1) 方法的执行顺序:onPreExecute –》 doInBackground –》 onPostExecute
(2)publishProgress: 发布进行,该方法应该在子线性执行(doInBackground) ==>onProgressUpdate。如果用户想要知道某一任务的进度的话,则需要调用此方法。

3.代码示例:
(1)需要展示进度的AsyncTask :中间参数不能为Void了

public class MainActivity extends Activity {

    private ProgressBar mProgressBar;
    private Button progresstextButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
        progresstextButton = (Button) findViewById(R.id.progress);
        mProgressBar.setVisibility(View.INVISIBLE);
    }

    // 点击启动按钮,开始访问网络
    public void start(View view) {
        DownloadTask task = new DownloadTask();
        task.execute();
    }

    private class DownloadTask extends AsyncTask<Void, Integer, Void> {

        @Override
        protected void onPreExecute() {
            // todo:显示近乎条,进度状态展示:
            super.onPreExecute();
            mProgressBar.setVisibility(View.VISIBLE);
            progresstextButton.setText("当前进度0%");

        }

        private int progressValue = 0;

        @Override
        protected Void doInBackground(Void... params) {
            // 子线程执行:模拟访问网络:
            for (int i = 1; i <= 100; i++) {
                SystemClock.sleep(100);
                // 更新进度值:
                progressValue = i;
                // 将进度值提交给界面:
                publishProgress(progressValue);
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            // 调用此方法的话必须调用publishProgress(处理message)
            super.onProgressUpdate(values);
            // button 显示进度状态更新:已经将progressValue传递到values中了
            int value = values[0];
            mProgressBar.setProgress(value);
            progresstextButton.setText("当前进度" + value + "%");

        }

        @Override
        protected void onPostExecute(Void result) {
            // 隐藏进度条
            super.onPostExecute(result);
            mProgressBar.setVisibility(View.INVISIBLE);
        }

    }
}

效果展示:
这里写图片描述

(2) 不需要展示进度的AsyncTask :中间参数为Void,并且不需要调用onProgressUpdate了。

匿名开辟AsyncTask:

new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                String url = "http://xxxxxxxxxxxxxxxxx";
                String json = HttpUtil.get(url, "utf-8");
                LogUtil.i("hxy", json);
                homeData = JSON.parseObject(json, HomeData.class);
                homeBannerItem = homeData.home_banner;
                homeItemList = homeData.home_classlist;
                //遍历集合并往imageurls中添加数据:大图用的picture
                for(home_banner_item item:homeBannerItem){
                    imageUrls.add(item.pic);
                }
                //遍历集合往往item项目中添加数据:拿到title,picture
                for(home_classlist_item listItem:homeItemList){
                    titleItems.add(listItem.title);
                }

                return null;
            }

            protected void onPostExecute(Void result) {
                //为mViewPager 装载数据:
                if(adapter==null){
                    adapter = new MyPageAdapter(homeBannerItem);
                    mViewPager.setAdapter(adapter);
                }else{
                    adapter.notifyDataSetChanged();
                }

                //为mListView装配数据:
                BaseAdapter adapter1 = new MyBaseAdapter(homeItemList);
                mListView.setAdapter(adapter1);

            };

        }.execute();

单独定义一个AsyncTask类:

DataTask task = new DataTask(this);
        task.execute(url);

public class DataTask extends AsyncTask<String, Void, Object>{

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // TODO:UI界面的展示

    }

//访问网络必须在子线程
    @Override
    protected Object doInBackground(String... params) {
        try {
            String json=HttpUtil.get(params[0], "utf-8");
            //TODO 解析json的代码:
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(Object result) {
        // TODO 更新UI界面的代码
        super.onPostExecute(result);
    }
}

4.注意AsyncTask的线程规则:
a.AsyncTask类必须在UI线程加载
b.AsyncTask.execute()必须在UI线性执行
c.四个封装方法不能手动回调,应该由框架来回调
d.任务只能执行一次,假如有不同的任务,再重新的new一个AsyncTask实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值