AsyncTask的简单使用

来源:互联网 发布:linux 开源日志服务器 编辑:程序博客网 时间:2024/05/22 10:50
    // 如果参数什么都没有,就Void    // params 请求的一个地址    // Progress 在子线程中发布进度的类型 一般是int String    // result 从子线程中返回的类型class MyAsnycTask extends AsyncTask<String, String, List<MyData>>{        //这是子线程的方法,网络请求在这个方法中进行        @Override        protected List<MyData> doInBackground(String... params) {            publishProgress("正在加载中...");            DefaultHttpClient httpClient = new DefaultHttpClient();            HttpGet httpGet = new HttpGet(params[0]);            try {                HttpResponse response = httpClient.execute(httpGet);                int statusCode = response.getStatusLine().getStatusCode();                if(statusCode==200){                    //这里可以用这种方法直接获取entity中的内容,并设置编码格式,也可以不设置                    //HttpEntity entity = response.getEntity();                    //String json = EntityUtils.toString(entity, "utf-8");                    InputStream inputStream = response.getEntity().getContent();                    int len;                    byte[] by=new byte[1024];                    ByteArrayOutputStream ba = new ByteArrayOutputStream();                    while((len=inputStream.read(by))!=-1){                        ba.write(by, 0, len);                    }                    //这个toString中可以设置编码格式,格式名大写                    String json=ba.toString("GBK");                    Gson gson=new Gson();                    MyMenu myMenu = gson.fromJson(json, MyMenu.class);                    System.out.println(myMenu.result.data.get(0).title);                    return myMenu.result.data;                }            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            return null;        }        //这个方法是执行请求前的准备,也就是准备执行的方法,一般显示进度条        @Override        protected void onPreExecute() {            pb.setVisibility(View.VISIBLE);            super.onPreExecute();        }        //这个是执行ui线程的方法,请求完数据会返回对象,一般可以返回json字符串,然后在UI线程中进行解析        @Override        protected void onPostExecute(List<MyData> result) {            super.onPostExecute(result);            pb.setVisibility(View.GONE);            MyAdapter adapter = new MyAdapter(MainActivity.this, result);            el.setAdapter(adapter);        }        //这个是请求进度的方法        @Override        protected void onProgressUpdate(String... values) {            // TODO Auto-generated method stub            super.onProgressUpdate(values);            System.out.println(values[0]);        }    }★★★★★    **多个请求可以在自定义AsyncTask中只写一个doInBackground的方法,然后返回一个json字符串,然后在执行的时候,通过get()方法返回这个json结果,然后执行,这个不会导致执行顺序问题,应该是阻塞式的**

try {
String json = asyncTask.execute(path+id,”rl”).get();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
然后对这个UI线程进行操作

这个方法是我自己原来写的,可以不用

如果有多个请求的话,可以创建一个外部类,通过构造函数接收传过来的值,然后通过asynctask.execute(“”,”“);发送过来数据,下面进行示例
第一次请求数据:

    private void setGv() {        //创建asyncTask对象,通过构造函数传送过去上下文,和ui线程中要设置的控件        MyAsyncTask asyncTask = new MyAsyncTask(getActivity(),gv);        //发送网站和一个标志,在asynctask中根据这个标志进行不同的操作        asyncTask.execute(path+position,"gv");    }

第二次请求数据:

    //这里发送的控件是一个相对布局,因为这个UI线程要控制多个控件,所以把整个布局都给发送过去,进行控制    //在asynctask通过rl.findViewById()进行查找设置    RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);    MyAsyncTask asyncTask = new MyAsyncTask(InfoActivity.this, rl);    asyncTask.execute(path+id,"rl");
//通过构造函数接收参数,接收上下文和view控件,这个控件可以是单一控件,也可以是组控件//需要不同的控件可以进行强转    public MyAsyncTask(Context context, View view) {        this.context=context;        this.view=view;        options = ImageLoaderutils.initOptions();    }    //请求数据    @Override    protected String doInBackground(String... params) {        //先获取传送过来的标志,赋值给全局变量tag        tag=params[1];        DefaultHttpClient httpClient = new DefaultHttpClient();        HttpGet httpGet = new HttpGet(params[0]);        try {            HttpResponse response = httpClient.execute(httpGet);            if(response.getStatusLine().getStatusCode()==200){                HttpEntity entity = response.getEntity();                String string = EntityUtils.toString(entity);                return string;            }        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }    //设置UI    @Override    protected void onPostExecute(String result) {        // TODO Auto-generated method stub        super.onPostExecute(result);        String json=result;        Gson gson=new Gson();        //如果发送过来的标记是gv的话        if("gv".equals(tag)){            GridView gv=(GridView)view;            final Today today = gson.fromJson(json, Today.class);            gv.setAdapter(new BaseAdapter() {                @Override                public View getView(int position, View convertView, ViewGroup parent) {                    View view2 = View.inflate(context, R.layout.item, null);                    TextView date = (TextView) view2.findViewById(R.id.date);                    TextView title = (TextView) view2.findViewById(R.id.title);                    date.setText(today.result.get(position).date);                    title.setText(today.result.get(position).title);                    return view2;                }                @Override                public long getItemId(int position) {                    // TODO Auto-generated method stub                    return 0;                }                @Override                public Object getItem(int position) {                    // TODO Auto-generated method stub                    return null;                }                @Override                public int getCount() {                    // TODO Auto-generated method stub                    return today.result.size();                }            });            gv.setOnItemClickListener(new OnItemClickListener() {                @Override                public void onItemClick(AdapterView<?> arg0, View arg1,                        int arg2, long arg3) {                    Intent intent=new Intent(context,InfoActivity.class);                    intent.putExtra("id", today.result.get(arg2).e_id);                    context.startActivity(intent);                }            });        }else{            RelativeLayout rl=(RelativeLayout)view;            ImageView image = (ImageView) rl.findViewById(R.id.image);            content = (TextView) rl.findViewById(R.id.content);            CheckBox box = (CheckBox) rl.findViewById(R.id.box);            InfoToday infoToday = gson.fromJson(json, InfoToday.class);            ImageLoader.getInstance().displayImage(infoToday.result.get(0).picUrl.get(0).url, image, options);            content.setText(infoToday.result.get(0).content);            box.setOnCheckedChangeListener(new OnCheckedChangeListener() {                @Override                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    if(isChecked){                        content.setLines(content.getLineCount());                    }else{                        content.setLines(2);                    }                }            });        }    }
0 0
原创粉丝点击