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     @Override
10     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                     @Override
18                     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.out
28                                                 .println(">>>>>>>>>>>>>>>>>Tick!");
29                                     }
30                                 } catch (InterruptedException e) {
31                                     // TODO Auto-generated catch block
32                                     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 block
42                         // 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     @Override
23     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             @Override
32             public void onClick(View v) {
33                 //由于读取互联网数据是比较耗时的,因此使用异步操作
34                 new AsyncTask<String, Void, Void>(){
35 
36                     @Override
37                     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 block
55                             e.printStackTrace();
56                         } catch (IOException e) {
57                             // TODO Auto-generated catch block
58                             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     @Override
25     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=bad
32         //问号后面,都是向服务器传递的数据
33         //get方法是将需要传递给服务器的数据,放在URL内部
34         //真实的URL是http://fanyi.youdao.com/openapi.do
35         //post方式
36         
37         findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
38             
39             @Override
40             public void onClick(View v) {
41                 //由于读取互联网数据是比较耗时的,因此使用异步操作
42                 new AsyncTask<String, Void, Void>(){
43 
44                     @Override
45                     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 block
77                             e.printStackTrace();
78                         } catch (IOException e) {
79                             // TODO Auto-generated catch block
80                             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

原文地址:https://www.cnblogs.com/510602159-Yano/p/4072781.html