package news1510a.bawei.com.a03_asynctask_demo;

import android.os.AsyncTask;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.Toast;

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

public void getData(View view){

//asyncAll();

AsyncTask asyncTask = new AsyncTask() {

@Override

protected String doInBackground(Void... voids) {

String path = "http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653";

try {

URL url = new URL(path);

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

connection.setRequestMethod("GET");

connection.setReadTimeout(5000);

connection.setConnectTimeout(5000);

int responseCode = connection.getResponseCode();

if (responseCode == 200){

InputStream inputStream = connection.getInputStream();

String json = streamToString(inputStream,"utf-8");

//json字符串已经获取到,,,也就是异步任务执行的结果获取到了

return json;

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

@Override

protected void onPostExecute(String s) {

Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();

//返回的数据可以解析

}

};

//调用

asyncTask.execute();

}

private String streamToString(InputStream inputStream,String charset) {

try {

InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset);

BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

String s = null;

StringBuilder builder = new StringBuilder();

while ((s = bufferedReader.readLine()) != null){

builder.append(s);

}

bufferedReader.close();

return builder.toString();

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

}

/**

* 这里面是展示异步任务的所有方法

*/

private void asyncAll() {

//需要一个异步任务对象....在异步任务中去处理耗时的操作,比如获取网络...是放在子线程中(后台线程中)

/**

* 有三个泛型参数...这三个泛型参数都可以为空...Void

* Params 一般值得是执行任务的时候传递过来的数据,,,,一般是访问的url,,,可以为空Void

* Progress 当前这个任务执行的进度...如果需要的话一般是Integer,,,,不需要为空Void

* Result 异步任务执行完成以后返回的结果,,,如果没有结果Void,,,如果有指定返回值的泛型,一般访问网络返回的是json字符串...String

*/

AsyncTask asyncTask = new AsyncTask() {

//在doInBackground之前调用的方法,,,也就是异步任务开始执行的第一个方法

@Override

protected void onPreExecute() {

super.onPreExecute();

}

//在后台执行的方法....相当于子线程...执行耗时的操作...不能再这个方法里面更新界面

@Override

protected String doInBackground(String... strings) {

try {

URL url = new URL(strings[0]);

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

connection.setRequestMethod("GET");

connection.setReadTimeout(5000);

connection.setConnectTimeout(5000);

int responseCode = connection.getResponseCode();

if (responseCode == 200){

InputStream inputStream = connection.getInputStream();

String json = streamToString(inputStream,"utf-8");

//json字符串已经获取到,,,也就是异步任务执行的结果获取到了

return json;

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

//异步任务执行进度发生改变的时候调用的方法,,,这个方法不会自动调用,,需要在doInBackGroud里面调用publishProgress()方法的时候会调用onProgressUpdate

@Override

protected void onProgressUpdate(Void... values) {

super.onProgressUpdate(values);

}

//发送任务执行的结果到主线程,,,,这个方法是处于主线程,,,可以更新界面

//String json就是doInBackground返回的数据

@Override

protected void onPostExecute(String json) {

//json是doInBackgroud返回的,,,此时在这里可以进行解析,,设置适配器的操作

Log.i("-json---",json);

}

//异步任务取消的时候执行的方法...asyncTask.cancel(true);执行的时候会自动执行onCancelled

@Override

protected void onCancelled() {

super.onCancelled();

}

};

//异步任务对象如果需要执行,需要调用下面的方法.....

asyncTask.execute("http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653");

//asyncTask.cancel(true);

}

查看原文 >>
相关文章