<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);
}
}

Android_AsyncTask_json的更多相关文章

随机推荐

  1. oracle 有关大数据

    一. oracle大数据量分区后查询效率低下的一些建议: 1 对于当前表tm_bus_realtime_log.查看它的索引,只有一个(索引名:INDEX_BUS_REALTIME 字段名:UPLOA ...

  2. [Andrew]Ext.net前台弹框

    //有询问的提示框 Ext.Msg.show({            title: title,            msg: msg,            buttons: Ext.Msg.Y ...

  3. 使用 cloc 统计代码行数

    可能大家都知道用 `wc -l` 命令进行代码行数统计,但是它会将代码中的注释.空行所占用的文本行都统计在内.如果想查看一个 tar 包或一个项目目录中“实际”的代码行数并且不愿意自己去写一个脚本来做 ...

  4. bzoj 2716 天使玩偶(CDQ分治,BIT)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=29234 [题意] 询问当前点与已知点的最小曼哈顿距离. [思路 ...

  5. NOIP2004 合唱队列

    三.合唱队形 (chorus.pas/dpr/c/cpp) [问题描述] N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位 ...

  6. Tcp服务端判断客户端是否断开连接

    今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的.好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链 ...

  7. MVC Razor 语法(转)

    http://blog.csdn.net/pasic/article/details/7072340 原文地址:MVC Razor 语法(转)作者:panzhaowen_jacki 语法名称 Razo ...

  8. 利用迅雷提供的接口从磁力链得到bt种子文件

    本地下载工具的磁力链下载速度不给力,而百度云盘有提供离线下载服务,相当于就是直接到服务器取个链接而已.但这需要bt文件,而我只有链力链.网上搜了一下,可以从磁力链构造一个bt文件的下载地址,用pyth ...

  9. HW5.30

    public class Solution { public static void main(String[] args) { for(int i = 3; i <= 1000; i++) i ...

  10. CocoaPods容易出现的问题;

    一.初次安装cocoapods打开项目遇:Pods-resources.sh: Permission denied报错. 此类报错是指编译器在打开Pods-resources.sh文件的时候遭遇权限问 ...