码迷,mamicode.com
首页 > 移动开发 > 详细

Android网络请求

时间:2015-07-18 15:39:40      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:apache   网络   线程   android   json   

     Android网络请求通常用的是HttpURLConnection类和HttpClient类,HttpURLConnection类是由java提供的网络访问请求类,而HttpClient类是由apache提供的,它相当于是一个增强版本的HttpURLConnection类,换句话来说,HttpURLConnection可以做的事情HttpClient全部可以做

由于网络请求在Android中是比较耗时的,所以不能放在主线程中,要不然会出现ANR的问题,因此网络请求通常放在线程中进行,这样就不会阻塞UI线程,可以更有利于用户的交互。以下实例涉及到对JSON数据的解析,如果不清楚的可以到点击打开链接

下面是HttpClient get请求的方式

获取网络数据的线程类

public class GetData extends Thread {
	Handler handler;
	String url;
	public GetData(Handler handler, String url) {
		this.handler = handler;
		this.url = url;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		HttpGet httpRequest = new HttpGet(url);// 建立http get联机
		HttpResponse httpResponse;
		String result = null;
		try {
		
			httpResponse = new DefaultHttpClient().execute(httpRequest);
			if (httpResponse.getStatusLine().getStatusCode() == 200)
			    result = EntityUtils.toString(httpResponse.getEntity(), "GBK");  //获取相应的字符串
			 try {  
			        JSONTokener jsonParser = new JSONTokener(result);  
			        JSONObject data = (JSONObject) jsonParser.nextValue();  
			        
			        JSONArray dataArray = data.getJSONArray("data");  
			        /*for(int t=0; t<dataArray.length(); ++t){
			        	JSONObject obj = (JSONObject) dataArray.get(t);
			        	String s1 = (String) obj.get("data");
			        	String s2 = (String) obj.get("content");
			        	String s3 = obj.getString("img");
			        	Log.e("huang", s1+" "+s2+" "+s3);
			        }*/		        
			        JSONObject obj = (JSONObject) dataArray.get(0);
		        	String s1 = (String) obj.get("data");
		        	String s2 = (String) obj.get("content");
		        	String s3 = obj.getString("img");
		        	
		        	//获取图片
		        	HttpGet get = new HttpGet(s3);
		        	HttpResponse res = new DefaultHttpClient().execute(get);
		        	InputStream in = res.getEntity().getContent();
		        	Bitmap img = BitmapFactory.decodeStream(in);
		        	
		        	Message msg = new Message();
		        	Bundle bundle = new Bundle();
		        	bundle.putString("s1", s1);
		        	bundle.putString("s2", s2);
		        	msg.obj = img;
		        	msg.setData(bundle);
		        	handler.sendMessage(msg);
		        	
			    } catch (JSONException ex) {  
			        // 异常处理代码  
			    }  
			
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}// 发出http请求		
	}
}

UI线程

public class Main extends Activity {
	Handler handler;
	TextView text, text1;
	ImageView img;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		text = (TextView) findViewById(R.id.text);
		text1 = (TextView) findViewById(R.id.text1);
		img = (ImageView) findViewById(R.id.img);
		handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				super.handleMessage(msg);
				Bundle b = msg.getData();
				Log.e("huang", b.getString("s1")+" "+b.getString("s2"));
				text.setText(b.getString("s1"));
				text1.setText(b.getString("s2"));
				img.setImageBitmap((Bitmap) msg.obj);
			}
		};
		new GetData(handler, "http://7xiwtn.com1.z0.glb.clouddn.com/data.jason.txt").start();
	}
	

}


运行结果:

技术分享




下面是HttpClient post请求的方式

     其实post请求跟get请求差不多,只不过在一些地方不同,一般像上传数据、提交数据一般都是用post请求,因为get请求是将参数明文添加在访问的url上,发送的数据大小有限,不安全,而post请求发送的数据量一般可以很大,安全。

public class PostData extends Thread {
	String url;
	public PostData(String url) {
		this.url = url;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		HttpPost post = new HttpPost(url);
		List<NameValuePair> params = new ArrayList<NameValuePair>(); 
		params.add(new BasicNameValuePair("mobileNo", "13826040804"));
		//post.addHeader("platform", "android");
		try {
			post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
			HttpResponse response = new DefaultHttpClient().execute(post);
			if(response.getStatusLine().getStatusCode() == 200){
				String result = EntityUtils.toString(response.getEntity());
				Log.e("huang", result);
				
				/*JSONTokener token = new JSONTokener(result);
				JSONObject obj = (JSONObject) token.nextValue();
				JSONObject obj1 = obj.getJSONObject("result");
				boolean check = obj1.getBoolean("IsSuccess");
				Log.e("huang", "isSuccess:"+check);*/
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			Log.e("huang", "error");
			e.printStackTrace();
			
		}
		
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android网络请求

标签:apache   网络   线程   android   json   

原文地址:http://blog.csdn.net/u012432475/article/details/46942427

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!