AsyncTask基础运用(请求网络)

来源:互联网 发布:在线数字抽奖软件 编辑:程序博客网 时间:2024/06/06 00:54

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。
Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。
为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务.
1.execute(Params… params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params… params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params… params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress… values)来更新进度信息。
4.onProgressUpdate(Progress… values),在调用publishProgress(Progress… values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params… params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params… params),onProgressUpdate(Progress… values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params… params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。

AsyncTask请求网络

import android.graphics.Bitmap;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import com.google.gson.Gson;import java.util.ArrayList;import java.util.List;/** * ctrl+o 重写方法 */public class MainActivity extends AppCompatActivity {    public String urlString = "http://api.expoon.com/AppNews/getNewsList/type/1/p/1";    String urlBitmap = "http://img.my.csdn.net/uploads/201407/26/1406383265_8550.jpg";    private ListView listView;    ArrayList<Product.DataBean> dataBeanList = new ArrayList();    private MAdapter mAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView) findViewById(R.id.lv);        //直接调用asyncTask类请求网络,把url传进去        mAdapter = new MAdapter();        listView.setAdapter(mAdapter);        //这行代码要在主线程调用;        new MAsyncTask().execute(urlString);    }    /**     * 泛型  第一个参数:传过来的url     * 第二个参数 :进度     * 第三个参数 :接口请求成功返回的东西(json,bitmap)     */    private class MAsyncTask extends AsyncTask<String, Void, String> {        /**         * 这个方法在子线程,在这个方法里进行联网操作         *         * @param strings 可变参数,底层是数组,里面放的是传过来的参数;         * @return         */        @Override        protected String doInBackground(String... strings) {            String urlTemp = strings[0];            //直接用工具类获取json            String netJson = NetUtil.getNetJson(urlTemp);            return netJson; //返回给(前台方法,主线程方法onPostExecute)        }        /**         * 这个方法在主线程, 直接更新ui即可;         *         * @param s s是doInBackground请求接口成功后返回的json         */        @Override        protected void onPostExecute(String s) {            super.onPostExecute(s);            Log.e("wzq", "onPostExecute: " + s);            //解析s,  直接给控件展示;            Gson gson = new Gson();            Product product = gson.fromJson(s, Product.class);            //把一个集合的数据放入另一个集合            List<Product.DataBean> temp = product.getData();            dataBeanList.addAll(temp);            mAdapter.notifyDataSetChanged();        }    }    private class MAdapter extends BaseAdapter {        @Override        public int getCount() {            Log.e("wzq", "getCount:" + dataBeanList.size());            return dataBeanList.size();        }        @Override        public Object getItem(int i) {            return dataBeanList.get(i);        }        @Override        public long getItemId(int i) {            return i;        }        @Override        public View getView(int i, View view, ViewGroup viewGroup) {            View view1 = View.inflate(MainActivity.this, R.layout.item02, null);            TextView tv_name = view1.findViewById(R.id.tv_name);            ImageView iv = view1.findViewById(R.id.iv);            tv_name.setText(dataBeanList.get(i).getNews_summary());//            iv.setImageBitmap("url");            new MBitMapAsyncTask(iv).execute(urlBitmap);            Log.e("wzq", "getCount:" + "执行getview");            return view1;        }    }    private class MBitMapAsyncTask extends AsyncTask<String,Void,Bitmap>{        private  ImageView iv;        public MBitMapAsyncTask(ImageView iv) {            this.iv = iv;        }        @Override        protected Bitmap doInBackground(String... strings) {            return NetUtil.getNetBitmap(strings[0]);        }        @Override        protected void onPostExecute(Bitmap bitmap) {            super.onPostExecute(bitmap);            iv.setImageBitmap(bitmap);        }    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肛裂出血几天了怎么办 肛裂拉屎出血该怎么办 孕期肛裂出血该怎么办 老人大便拉不出来怎么办 拉屎拉的屁眼疼怎么办 拉屎堵在肛门口怎么办 上火拉大便有血怎么办 7岁儿童大便带血怎么办 阴炎用药后出血怎么办 孕晚期大便拉不出来怎么办 想拉屎拉不出来怎么办 4岁幼儿大便干燥怎么办 2岁幼儿大便干燥怎么办 1岁幼儿大便干燥怎么办 5岁幼儿大便干燥怎么办 4岁儿童大便干燥怎么办 狗吃别的狗的屎怎么办 狗狗黄疸怎么办最有效 拉屎出血但不疼怎么办 没拉出时就出血怎么办 拉不出大便怎么办肛门像被堵住 尿里粘液丝高怎么办 右肋骨里面疼是怎么办 腰受凉直不起来怎么办 干活累了腰疼怎么办 打球腰打球腰疼怎么办 生完孩子腰酸痛怎么办 腰窝哪里痛是怎么办 尿结石疼的时候怎么办 站久了脚底痛怎么办 站久了脚板痛怎么办 站久脚底板酸痛怎么办 累的腿疼怎么办小妙招 脚走路多了疼怎么办 脚走路多了腿疼怎么办 走路多了脚心疼怎么办 坐时间长了腰疼怎么办? 开车久了腰疼怎么办 站时间久了腰疼怎么办 上班站久了腰疼怎么办 站久了腰疼怎么办