使用AsyncTask异步加载类进行访问网络数据json的理解和用法

总结一下目前我应用到的访问网络json数据的方式有四种:

1.Httpclient方式

2.HttpUrlConnection 方式

3.AsyncTask方式

4.HttpUtils方式

HttpClient 和HttpUrlConnection两种方式这里暂不讨论,针对AsyncTask方式访问网络json数据来进行简单的理解描述。


1.AsyncTask异步加载类原理描述:

AsyncTask的本质是一个线程池,最大能加载128个线程池子。所有提交的异步任务都会在这个线程池中的工作线程内执行,当工作线程需要跟UI线程交互时,工作线程会通过向在UI线程创建的Handler。AsyncTask是Android提供的一个助手类,它对Thread和Handler进行了封装,方便我们使用。Android之所以提供AsyncTask这个类,就是为了方便我们在后台线程中执行操作,然后将结果发送给主线程,从而在主线程中进行UI更新等操作。在使用AsyncTask时,我们无需关注Thread和Handler,AsyncTask内部会对其进行管理,这样我们就只需要关注于我们的业务逻辑即可。

AsyncTask有四个重要的回调方法,分别是:onPreExecute、doInBackground, onProgressUpdate 和 onPostExecute。这四个方法会在AsyncTask的不同时期进行自动调用,我们只需要实现这几个方法的内部逻辑即可。这四个方法的一些参数和返回值都是基于泛型的,而且泛型的类型还不一样,所以在AsyncTask的使用中会遇到三种泛型参数:Params, Progress 和 Result,代码片段如下:

    // 自定义类继承异步加载类AsyncTask

    //可变参数列表:

    //第一个参数表示做耗时操作doInBackground方法返回的返回值类型,返回的值也是联网后方法里传的参数;

    //第二个参数表示进度更新时onProgressUpdate方法的进度类型

    //第三个参数表示做耗时操作doInBackground方法的返回值类型也是联网后onPostExecute方法里的传参

    

 

package com.hhh.text_asynctask_lianxi;


import java.io.IOException;

import java.util.List;

import java.util.concurrent.ExecutionException;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

import com.google.gson.Gson;

import com.hhh.text_base.MyBaseAdapter;

import com.hhh.text_dao.Li;

import com.hhh.text_dao.Wai;

import android.os.AsyncTask;

import android.os.Bundle;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.util.Log;

import android.widget.ListView;

import android.widget.Toast;


/**

 * 使用异步加载类AsyncTask来实现对网络数据的请求解析并绑定

 * @author xingzhe

*注意各个类中的各个方法是什么意思以及各个方法传参的逻辑关系*

 * 注意 :AsyncTask必须在ui线程中执行,AsyncTask类中的方法无需手动调用

 * 标准

 */

public class MainActivity extends Activity {

    private ListView listview;

    private String url = "http://apis.juhe.cn/goodbook/catalog?key=cca134699ab46a8322a322c8c011449a";

    

    public String entitydata;

    private List<Li> result;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        listview = (ListView) findViewById(R.id.listview);


        // 实例化异步加载类对象

        MyAsyncTask myasynctask = new MyAsyncTask();

        try {

            // 意指从异步加载类中执行联网操作的doInBackground方法中返回的返回值获取到

            List<Li> result = myasynctask.execute(url).get();


            MyBaseAdapter base = new MyBaseAdapter(MainActivity.this, result);

            listview.setAdapter(base);


        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (ExecutionException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }


    }


    // 自定义类继承异步加载类AsyncTask

    //可变参数列表:

    //第一个参数表示做耗时操作doInBackground方法返回的返回值类型,返回的值也是联网后方法里传的参数;

    //第二个参数表示进度更新时onProgressUpdate方法的进度类型

    //第三个参数表示做耗时操作doInBackground方法的返回值类型也是联网后onPostExecute方法里的传参

    

    class MyAsyncTask extends AsyncTask<String, Integer, List<Li>> {

        private Wai wai;


        @Override

        // 联网请求数据前的方法

        protected void onPreExecute() {

            Toast.makeText(MainActivity.this, "即将联网中。。。", 0).show();

        }


        @SuppressLint("ShowToast")

        @Override

        // 联网请求数据--->做耗时操作的方法

        protected List<Li> doInBackground(String... params) {

            // 结合httpclient方式进行访问网络数据


            HttpClient httpclient = new DefaultHttpClient();

            HttpGet httpget = new HttpGet(url);

            HttpResponse response;

            try {

                response = httpclient.execute(httpget);

                if (response.getStatusLine().getStatusCode() == 200) {

                    HttpEntity httpentity = response.getEntity();

                    //这里要注意:获得的实体数据才是联网

                    entitydata = EntityUtils.toString(httpentity);

                    Log.i("SSS", "--------------------------" + entitydata);

                    Gson gson = new Gson();

                    wai = gson.fromJson(entitydata, Wai.class);

                    result = wai.getResult();

                }


            } catch (ClientProtocolException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            return result;

        }


        // 联网请求数据后的方法

        @Override

        protected void onPostExecute(List<Li> result) {

            // TODO Auto-generated method stub

            super.onPostExecute(result);

        }


        // 进度条进度更新的方法

        @Override

        protected void onProgressUpdate(Integer... values) {

            // TODO Auto-generated method stub

            super.onProgressUpdate(values);

        }


    }


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值