AsyncTask 异步任务 + json 解析 网络数据

原创 2016年08月30日 22:05:58
package com.qf.day07_asynctask_04;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.Toast;

public class MainActivity extends Activity {

	private ProgressBar progressBar;

	private Spinner spinner;

	private MyTask myTask;

	private String path = "http://m2.qiushibaike.com/article/list/suggest?page=1";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		progressBar = (ProgressBar) findViewById(R.id.progress_id);
		spinner = (Spinner) findViewById(R.id.spinner_id);

	}

	// 按钮点击事件
	public void clickButton(View v) {
		switch (v.getId()) {
		case R.id.start:
			// 开启异步任务, 下载内容
			myTask = new MyTask();

			myTask.execute(path);

			break;

		case R.id.stop:
			// 停止异步任务
			myTask.cancel(true);

			break;
		}
	}

	/**
	 * 自定义异步任务, 加载数据(json)
	 * 
	 * @author Administrator
	 * 
	 */
	public class MyTask extends AsyncTask<String, Integer, List<String>> {
		@Override
		protected void onPreExecute() {
			// TODO 事前方法, 初始化工作
			super.onPreExecute();

			// 进度条显示
			progressBar.setVisibility(View.VISIBLE);

			// 当前的进度值=0
			progressBar.setProgress(0);

		}

		@Override
		protected List<String> doInBackground(String... params) {
			// TODO 后台运行, 执行耗时的操作

			try {

				// 向网络获取数据json
				URL url = new URL(params[0]);

				HttpURLConnection conn = (HttpURLConnection) url
						.openConnection();

				conn.setRequestMethod("GET");

				// 请求数据时不能以压缩的方式返回
				conn.setRequestProperty("Accept-Encoding", "identity");

				conn.connect();

				if (conn.getResponseCode() == 200) {
					InputStream is = conn.getInputStream();

					// 得到数据的总长度
					long maxLen = conn.getContentLength();

					Log.i("info", "maxLen = " + maxLen);

					// 得到数据当前的加载长度
					long curLen = 0;

					// 读取数据
					byte[] buffer = new byte[1024];
					int len = 0;

					StringBuilder sBuilder = new StringBuilder();

					while ((len = is.read(buffer)) != -1) {

						sBuilder.append(new String(buffer, 0, len));

						// 计算当前加载的进度值 百分比
						// int progress = (int)(当前加载的长度 *100 / 总长度);

						curLen += len;

						int progress = (int) (curLen * 100 / maxLen);

						// 异步更新进度条(onProgressUpdate(Integer... values))
						publishProgress(progress);

						Thread.sleep(500);
					}

					// 解析数据,并且返回
					return ParseJson.parseJson(sBuilder.toString());
				}
			} catch (Exception e) {
				// TODO: handle exception
			}

			return null;
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			// TODO 实时更新进度
			super.onProgressUpdate(values);

			// 实时更新进度条
			progressBar.setProgress(values[0]);

		}

		@Override
		protected void onPostExecute(List<String> result) {
			// TODO 事后方法: 更新UI
			super.onPostExecute(result);
			// 进度条消失
			progressBar.setVisibility(View.GONE);

			// 通过适配器, 将获取到的数据填充到Spinner中
			if (result != null && result.size() > 0) {

				// 控件 spinner
				// 数据源 result
				// 适配器

				ArrayAdapter<String> adapter = new ArrayAdapter<String>(
						MainActivity.this,
						android.R.layout.simple_spinner_item, result);

				spinner.setAdapter(adapter);

			} else {
				Toast.makeText(MainActivity.this, "网络异常", Toast.LENGTH_LONG)
						.show();
			}
		}
	}

}

package com.qf.day07_asynctask_04;

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

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

/**
 * 解析json数据
 * @author Administrator
 *
 */
public class ParseJson {

	
	public static List<String> parseJson(String jsonStr) throws JSONException {
		
		List<String> data = new ArrayList<String>();
		
		if(jsonStr!=null)
		{
			JSONObject jsonObject = new JSONObject(jsonStr);
			
			JSONArray jsonArray = jsonObject.getJSONArray("items");
			
			for(int i=0;i<jsonArray.length();i++)
			{
				JSONObject jsonObject2 = jsonArray.getJSONObject(i);
				
				String content = jsonObject2.getString("content");
				
				data.add(content);
			}
		}
		return data;
	}

}

<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" >

    <Button
        android:id="@+id/start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取数据"
        android:onClick="clickButton" />
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/stop"
        android:text="停止获取"
        android:layout_toRightOf="@id/start"
        android:onClick="clickButton" 
        />
    
    <ProgressBar 
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:id="@+id/progress_id"
        android:layout_below="@id/start"
        android:layout_marginTop="20dp"
        style="?android:attr/progressBarStyleHorizontal"
        android:visibility="gone"
        />
    
    <Spinner 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/spinner_id"
        android:layout_below="@id/progress_id"
        android:layout_marginTop="20dp"
        />

</RelativeLayout>

Android数据解析之JSON,网络编程之URL,异步任务AsyncTask讲解

工作内容: 1.网络编程之RUL 2.JSON数据解析 学习分享: 一、网络编程之RUL

Android之异步任务AsyncTask解析Json数据

异步任务AsyncTask解析Json数据
  • ly_rose
  • ly_rose
  • 2015年12月13日 21:59
  • 1354

【Android学习笔记系列】AsyncTask、BaseAdapter整合异步加载用例(通过解析JSON格式数据加载网络图片内容)

什么是异步加载 异步加载就是用异步的方式去加载数据,也就是用非主线程去加载数据的意思 为什么要异步加载 原因大概有两个: 第一、  为了提高用户体验,让用户加载数据的时候不会感到明显的卡顿...

Android Studio利用异步任务AsyncTask发送post请求获取json数据

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI...

Android 利用异步任务AsyncTask发送post请求获取json数据

首先是AysncTask类: /** * Created by kfbmac3 on 16/7/8. */ /* AsyncTask是个抽象类,使用时需要继承这个类,...

异步任务加载网络数据——AsyncTask使用

AsyncTask类简单介绍 Android从1.5开始引入了AsyncTask这个类,AsyncTask内部使用Java 1.5的并发库比普通初级Android开发者编写的Thread+Handle...

AsyncTask异步任务加载网络数据

AsyncTask就是异步加载网络数据。跟那个new一个子线程加载数据一样。用了这个AsyncTask就不需要再new子线程了,里面有一个线程池,最多开五个线程。。 ...

异步任务AsyncTask及JSON解析

异步任务AsyncTask及JSON解析 一、AsyncTask: (一)、相关知识回顾: 1、开发Android应用时必须遵...

异步任务AsyncTask及JSON解析

一、AsyncTask: (一)、相关知识回顾: 1、开发Android应用时必须遵守单线程模型的原则:          Android UI操作并不是线程安全的,并且这些操作必须在UI线程中执...

异步任务AsyncTask及JSON解析

1、AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。 Params启动任务执行的输入参数,比如HTTP请求的URL。一般...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AsyncTask 异步任务 + json 解析 网络数据
举报原因:
原因补充:

(最多只允许输入30个字)