首页 > 代码库 > 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 }
MainActivity 

2. Android中基于HTTP的通信技术

  参考文章:浅谈HTTPGetPost的区别 http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

2.1 使用HttpGet方式读取网络数据

  这里使用了有道翻译APIexecute("http://fanyi.youdao.com/openapi.do?keyfrom=testwangluo&key=936705455&type=data&doctype=json&version=1.1&q=china")表示查询词为chinajson数据格式,会传回一定的信息。官网上的说明如下:

  本例程通过单击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 }
MainActivity 

2.2 使用HttpPost方式与网络交互通信

  功能与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 }
MainActivity

3. Android中基于Socket的网络通信

  Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。ServerSocket 用于服务器端,Socket 是建立网络连接时使用的。

  参考文章:揭开Socket编程的面纱 http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx

 

17_Android网络通信