Android4.0 以后不允许在主线程进行网络连接
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Android4.0 以后不允许在主线程进行网络连接
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                Android4.0 以后不允許在主線程進行網(wǎng)絡(luò)連接,否則會出現(xiàn)?android.os.NetworkOnMainThreadException。因此,必須另起一個線程進行網(wǎng)絡(luò)連接方面的操作。
package com.lujinhong.irmcdc.dao;import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner;public class ResourceDao {String returnLine = "hi";public String getAllContentByName() {Runnable r = new NetWorkHandler();Thread thread = new Thread(r);thread.start();try {Thread.sleep(15000);} catch (InterruptedException e) {e.printStackTrace();}return returnLine;}private class NetWorkHandler implements Runnable {String line = "line";Socket socket = null;Scanner scanner = null;@Overridepublic void run() {try {socket = new Socket("time-A.timefreq.bldrdoc.gov", 13);scanner = new Scanner(socket.getInputStream());while (scanner.hasNextLine()) {line = scanner.nextLine();returnLine += line;}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {scanner.close();try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} }1、由于網(wǎng)絡(luò)連接需要一定時間,為了在主界面上進行網(wǎng)絡(luò)信息的展現(xiàn),暫時用sleep()方法簡單實現(xiàn),使主線程等待網(wǎng)絡(luò)信息讀取完成。 Thread.sleep(5000);
修改以下 問題,使用wai()及nofifyAll處理。
package com.ljh.irmcdc.dao;import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner;public class ResourceDao {String returnLine = "";public String getAllContentByName() {Runnable r = new NetWorkHandler();Thread thread = new Thread(r);thread.start();synchronized (this) {try {wait(20000);} catch (InterruptedException e) {e.printStackTrace(); } }return returnLine;}private class NetWorkHandler implements Runnable {String line = "line";Socket socket = null;Scanner scanner = null;@Overridepublic void run() {try {// socket = new Socket("time-A.timefreq.bldrdoc.gov", 13);socket = new Socket("192.168.136.44", 8179);scanner = new Scanner(socket.getInputStream());returnLine = "";while (scanner.hasNextLine()) {line = scanner.nextLine();returnLine += line;} //不要直接使用this,否則nofity的對象不是上面wait所鎖定的對象。synchronized (ResourceDao.this) {ResourceDao.this.notifyAll();}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {scanner.close();try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} }注意:
1、在內(nèi)部類中引用外部類對象的方法:
ResourceDao.this.notifyAll();2、wai()及nofity()必須放在synchronized塊里面。
尤其注意在內(nèi)部類中notify()外部類對象時,不要使用this,而應(yīng)該是上述所表。
 
 
總結(jié)
以上是生活随笔為你收集整理的Android4.0 以后不允许在主线程进行网络连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 建立简单的服务器端程序
- 下一篇: 线程之一:JAVA线程基础
