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
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- 简单的AsyncTask使用例子
- Android AsyncTask 的简单使用
- Android中AsyncTask的简单使用
- Android 中的AsyncTask的简单使用心得
- Android AsyncTask+Soap 的简单使用
- AsyncTask的简单使用以及注意事项
- 模仿微信标签功能的多行LinearLayout效果
- 关于R语言和社交网络分析的几篇文章
- 指哪打哪地进行编译工作
- 分布式进程
- 一个perl URLencode URLdecode的方法 (2009-07-22 15:47:36)转载▼
- AsyncTask的简单使用
- AJAX简单使用介绍
- shell 去除 ^M
- sql 外键 on update cascade 和 on delete cascade 作用区别?
- 使用pdfbox解析pdf文档信息(属性,内容,图片)
- Android属性之build.prop生成过程分析
- JQuery Ajax的实现原理以及二次封装通用的Ajax
- eclipse+webservice开发实例
- #chkconfig: 2345 20 80