Tears_fg

导航

Android_AsyncTask_json

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Spinner 
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>

UpdateData.java

package com.example.day07_asynctask_json;

import java.util.List;

public interface UpdateData {
    public void updataNewView(List<String>list);
}

HttpUtils.java

package com.example.day07_utils;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class HttpUitls {
    //获得字符串
    public static String getJsonDataByInternet(String path){
        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(path);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            if(200 == httpResponse.getStatusLine().getStatusCode()){
                HttpEntity entity = httpResponse.getEntity();
                String jsonData = EntityUtils.toString(entity);
                return jsonData;
            }
        
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return path;
    }
}

ParserData.java

package com.example.day07_parser;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class ParserData {

    public static  List parserDada(String data){
        try {
            
            JSONObject jsonObject = new JSONObject(data);
            JSONArray jsonArray = jsonObject.getJSONArray("results");
            List<String> list = new ArrayList<String>();
            String name;
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject2 = jsonArray.getJSONObject(i);
                name = jsonObject2.getString("namecn");
                list.add(name);
            }
            return list;
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return null;
        
    }
}    

main.java

package com.example.day07_asynctask_json;

import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
/**
 * 网络解析json数据并显示在spinner中
 * 1.初始化控件
 * 2.初始化数据
 *         1.创建异步任务
 *         2.网络请求数据获取得json字符串
 *         3.解析json数据存到list集合
 *         4.将list传给主线程
 *     3.创建适配器
 *     4.适配器控件设置适配器
 * @author my
 *注意:需要在清单文件中添加网络权限
 */
public class MainActivity extends Activity implements UpdateData{

    private Spinner spinner;
    private static final String path = "http://openapi.db.39.net/app/GetDrugCompany?sign=9DFAAD5404FCB6168EA6840DCDFF39E5&app_key=app";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        spinner = (Spinner) findViewById(R.id.spinner);
        
        //创建异步任务类
        /**
         * 第一种方式:将上下文与适配器控件当作参数传给异步任务类
         */
//        new MyAsyncTask(spinner,MainActivity.this).execute(path);
        
        /**
         * 第二种 在MainActivity中创建方法updataData(List<String> list)来更新数据
         */
//        new MyAsyncTask(MainActivity.this).execute(path);
        
        /**
         * 第三种方式:将更新数据的方法抽取成一个接口,让本类实现其抽象方法updataNewView(List<String>list)
         * 
         */
//        new MyAsyncTask(MainActivity.this).execute(path);
        
        /**
         * 第四种方式:实例化接口作为参数传入,并实现方法,在任务类中调用此方法,获得数据
         * 该方式大大降低了任务类与MainActivity的耦合性,俗称接口回调
         */
        new MyAsyncTask(MainActivity.this,new UpdateData() {
            
            @Override
            public void updataNewView(List<String> list) {
                // TODO Auto-generated method stub
                //创建适配器
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list);
                spinner.setAdapter(adapter);
            }
        }).execute(path);
    }
    public  void updataData(List<String> list){
        //创建适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list);
        spinner.setAdapter(adapter);

    }
    @Override
    public void updataNewView(List<String> list) {
        //创建适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list);
        spinner.setAdapter(adapter);        
    }
}

MyAsyncTask.java

package com.example.day07_asynctask_json;

import java.util.List;

import com.example.day07_parser.ParserData;
import com.example.day07_utils.HttpUitls;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class MyAsyncTask extends AsyncTask<String, Integer, List<String>> {
    private Spinner spinner;
    private Context context;
    private UpdateData updateData;
    public MyAsyncTask(Context context){
        this.context = context;
    }
    public MyAsyncTask(Spinner spinner,Context context){
        this.spinner = spinner;
        this.context = context;
    }
    public MyAsyncTask(Context context,UpdateData updateData){
        this.context = context;
        this.updateData = updateData;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected List<String> doInBackground(String... params) {
        //            2.网络请求数据获取得json字符串
        //          3.解析json数据存到list集合
        //          4.将list传给主线程
        String jsonData = HttpUitls.getJsonDataByInternet(params[0]);
        List<String>list = ParserData.parserDada(jsonData);
//        Log.i("MainActivity", list.toString());
        return list;
        
    }
    /**在主线程中执行以下代码
     * 第一种方式,直接执行以下代码
     */
/*    @Override
    protected void onPostExecute(List<String> result) {
        super.onPostExecute(result);
        //创建适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, result);
        spinner.setAdapter(adapter);

    }*/
    /**
     * 第二,三种方式,使用MainActivity对象调用其方法
     * 
     */
/*    @Override
    protected void onPostExecute(List<String> result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        //((MainActivity)context).updataData(result);//第二三种
    }*/
    
    /**
     * 第四种方式:使用接口实例化对象调用其方法,降低了与MainActivity的耦合度
     */
    @Override
    protected void onPostExecute(List<String> result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        updateData.updataNewView(result);
    }
}

 

 

posted on 2016-08-02 21:54  Tears_fg  阅读(247)  评论(0编辑  收藏  举报