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