您的位置:首页 > 理论基础 > 计算机网络

Android4.0 以后不允许在主线程进行网络连接 分类: H1_ANDROID 2013-10-09 14:32 2744人阅读 评论(0) 收藏

2013-10-09 14:32 615 查看
Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException。因此,必须另起一个线程进行网络连接方面的操作。

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;
@Override
public 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、由于网络连接需要一定时间,为了在主界面上进行网络信息的展现,暂时用sleep()方法简单实现,使主线程等待网络信息读取完成。

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;

@Override
public 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、在内部类中引用外部类对象的方法:

ResourceDao.this.notifyAll();


2、wai()及nofity()必须放在synchronized块里面。

尤其注意在内部类中notify()外部类对象时,不要使用this,而应该是上述所表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐