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的通信技术
参考文章:浅谈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 @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 使用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 @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