URLConnection的post请求网络数据和AsyncTask异步线程

一、ManiActivity

package com.example.urlconnection1;

import com.example.thread.MyAsyncTask;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;

/**
 * 用URLConnection的post请求网络数据
 *
 */

public class MainActivity extends Activity 
{
	//定义成员变量
	private ListView lv;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //找对象
        lv=(ListView) super.findViewById(R.id.lv);
        
        MyAsyncTask at=new MyAsyncTask(MainActivity.this,lv);	//创传值
        at.execute("http://japi.juhe.cn/book/recommend.from");	//开启线程,给doInBackground()方法传值
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}


二、异步线程

package com.example.thread;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

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

import com.example.model.One;
import com.google.gson.Gson;

//创建一个类,继承AsyncTask,异步线程

public class MyAsyncTask extends AsyncTask<String, String, One>
{
	//定义成员变量
	private Context context;
	private ListView lv;
	
	public MyAsyncTask(Context context, ListView lv) {
		super();
		this.context = context;
		this.lv = lv;
	}

	@Override
	protected One doInBackground(String... params) {
		try {
			URL url=new URL(params[0]);	//获取传来的URL
			HttpURLConnection conn=(HttpURLConnection) url.openConnection();	//获取HttpURLConnection对象
			
			conn.setRequestMethod("POST");	//设置发送请求的方法是post
			conn.setDoOutput(true);			//设置允许输出(post时必须设置,get是不用设置)
			conn.setConnectTimeout(5000);	//设置连接超时的时间限制
			conn.setReadTimeout(5000);		//设置读取时间限制
			conn.setRequestProperty("Charset", "UTF-8");			//设置文字字符集
			conn.setRequestProperty("Connection", "Keep-Alive");	//设置维持长连接
			
			OutputStream os=conn.getOutputStream();	//获取URLConnetction对应的输出流,用于向URLConnetction发送请求参数
			PrintWriter pw=new PrintWriter(os);	//创建文本输出流
			pw.print("key=188945f8e9072f0b5300f5573bac1aca&cat=1&ranks=1");	//发送请求的参数
			pw.flush();
			pw.close();
			
			if(conn.getResponseCode()==200)	//对响应码进行判断,是否连接成功
			{
				InputStream is=conn.getInputStream();	//获取URLConnetction对应的输出流,用于获取URLConnection响应的内容
				byte[] bt=new byte[1024];
				StringBuffer sb=new StringBuffer();
				int readLine=0;
				while(-1 != (readLine=is.read(bt)))
				{
					sb.append(new String(bt, 0, readLine)); 	先把字节转换成字符,再拼接成字符串	     参数:1.byte数组 2.开始转换字节的下标 3.字节数组的长度 
				}
				
				Gson g=new Gson();
				One one=g.fromJson(sb.toString(), One.class);	//解析JSON数据
				Log.e("TAG", "解析的数据是:"+one.toString()+one.result.data.toString());
				return one;
			}else
			{
				throw new RuntimeException("请求url失败");
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	

	//在这个方法共改变界面
	@Override
	protected void onPostExecute(One result) {
		super.onPostExecute(result);
		ArrayAdapter adapter=new ArrayAdapter(context, android.R.layout.simple_list_item_1, result.result.data);
		lv.setAdapter(adapter);
	}
	
	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		super.onPreExecute();
	}

	@Override
	protected void onProgressUpdate(String... values) {
		// TODO Auto-generated method stub
		super.onProgressUpdate(values);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值