首页 > 代码库 > 17_Android网络通信
17_Android网络通信
1. Android异步任务处理
在程序开启后,就会有一个主线程,负责与用户交互。如果在主线程中执行了耗时操作,那么界面就会停止响应,所以要将耗时操作转移到别的线程中。
AsyncTask的用法,包括传入参数、设定后台任务、过程信息的处理等。
下面代码的作用是:点击Button后,创建线程每隔3秒通过System.out.println()打印一段语句。
1 package com.example.testthread; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 7 public class MainActivity extends Activity { 8 9 @Override10 protected void onCreate(Bundle savedInstanceState) {11 super.onCreate(savedInstanceState);12 setContentView(R.layout.activity_main);13 14 findViewById(R.id.button1).setOnClickListener(15 new View.OnClickListener() {16 17 @Override18 public void onClick(View v) {19 20 // 创建新线程,不会影响主线程。并发执行21 new Thread() {22 public void run() {23 try {24 25 while (true) {26 sleep(3000);27 System.out28 .println(">>>>>>>>>>>>>>>>>Tick!");29 }30 } catch (InterruptedException e) {31 // TODO Auto-generated catch block32 e.printStackTrace();33 }34 }35 }.start();36 37 // try {38 // Thread.sleep(3000);39 // System.out.println(">>>>>>>>>>>>>>>>>Tick!");40 // } catch (InterruptedException e) {41 // // TODO Auto-generated catch block42 // e.printStackTrace();43 // }44 }45 });46 }47 }
2. Android中基于HTTP的通信技术
参考文章:浅谈HTTP中Get与Post的区别 http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
2.1 使用Http的Get方式读取网络数据
这里使用了有道翻译API,execute("http://fanyi.youdao.com/openapi.do?keyfrom=testwangluo&key=936705455&type=data&doctype=json&version=1.1&q=china")表示查询词为china,json数据格式,会传回一定的信息。官网上的说明如下:
本例程通过单击Button,向系统输出"china"单词的查询结果。需要互联网权限。
1 package com.example.httpget; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.net.MalformedURLException; 8 import java.net.URL; 9 import java.net.URLConnection;10 11 import android.app.Activity;12 import android.os.AsyncTask;13 import android.os.Bundle;14 import android.view.View;15 import android.widget.TextView;16 17 18 public class MainActivity extends Activity {19 20 private TextView textView;21 22 @Override23 protected void onCreate(Bundle savedInstanceState) {24 super.onCreate(savedInstanceState);25 setContentView(R.layout.activity_main);26 27 textView = (TextView) findViewById(R.id.textView1);28 29 findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {30 31 @Override32 public void onClick(View v) {33 //由于读取互联网数据是比较耗时的,因此使用异步操作34 new AsyncTask<String, Void, Void>(){35 36 @Override37 protected Void doInBackground(String... params) {38 URL url;39 try {40 url = new URL(params[0]);41 URLConnection connection = url.openConnection();42 InputStream is = connection.getInputStream();43 InputStreamReader isr = new InputStreamReader(is, "UTF-8");44 BufferedReader br = new BufferedReader(isr);45 String line;46 while ((line = br.readLine()) != null) {47 System.out.println(line);48 //textView.setText(line);49 }50 br.close();51 isr.close();52 is.close();53 } catch (MalformedURLException e) {54 // TODO Auto-generated catch block55 e.printStackTrace();56 } catch (IOException e) {57 // TODO Auto-generated catch block58 e.printStackTrace();59 }60 return null;61 }62 63 }.execute("http://fanyi.youdao.com/openapi.do?keyfrom=testwangluo&key=936705455&type=data&doctype=json&version=1.1&q=china");64 }65 });66 }67 68 }
2.2 使用Http的Post方式与网络交互通信
功能与Get方式一样,代码如下:
1 package com.example.httppost; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.InputStreamReader; 8 import java.io.OutputStreamWriter; 9 import java.net.HttpURLConnection;10 import java.net.MalformedURLException;11 import java.net.URL;12 import com.example.httpget.R;13 14 import android.app.Activity;15 import android.os.AsyncTask;16 import android.os.Bundle;17 import android.view.View;18 19 20 public class MainActivity extends Activity {21 22 //private TextView textView;23 24 @Override25 protected void onCreate(Bundle savedInstanceState) {26 super.onCreate(savedInstanceState);27 setContentView(R.layout.activity_main);28 29 //textView = (TextView) findViewById(R.id.textView1);30 31 //http://fanyi.youdao.com/openapi.do?keyfrom=testHTTP12&key=1382355899&type=data&doctype=json&version=1.1&q=bad32 //问号后面,都是向服务器传递的数据33 //get方法是将需要传递给服务器的数据,放在URL内部34 //真实的URL是http://fanyi.youdao.com/openapi.do35 //post方式36 37 findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {38 39 @Override40 public void onClick(View v) {41 //由于读取互联网数据是比较耗时的,因此使用异步操作42 new AsyncTask<String, Void, Void>(){43 44 @Override45 protected Void doInBackground(String... params) {46 URL url;47 try {48 url = new URL(params[0]);49 HttpURLConnection connection = (HttpURLConnection) url.openConnection();50 51 //设置connection向服务器传输数据52 connection.setDoOutput(true);53 connection.setRequestMethod("POST");54 55 OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");56 BufferedWriter bw = new BufferedWriter(osw);57 //不用带问号58 bw.write("keyfrom=testHTTP12&key=1382355899&type=data&doctype=json&version=1.1&q=china");59 //强制输出60 bw.flush();61 62 63 64 InputStream is = connection.getInputStream();65 InputStreamReader isr = new InputStreamReader(is, "UTF-8");66 BufferedReader br = new BufferedReader(isr);67 String line;68 while ((line = br.readLine()) != null) {69 System.out.println(line);70 //textView.setText(line);71 }72 br.close();73 isr.close();74 is.close();75 } catch (MalformedURLException e) {76 // TODO Auto-generated catch block77 e.printStackTrace();78 } catch (IOException e) {79 // TODO Auto-generated catch block80 e.printStackTrace();81 }82 return null;83 }84 85 }.execute("http://fanyi.youdao.com/openapi.do");86 }87 });88 }89 90 }
3. Android中基于Socket的网络通信
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。ServerSocket 用于服务器端,Socket 是建立网络连接时使用的。
参考文章:揭开Socket编程的面纱 http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx
17_Android网络通信