• Android4.0 以后不允许在主线程进行网络连接


    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,而应该是上述所表。





  • 相关阅读:
    [原创]K8Cscan插件之Mysql密码爆破(内网渗透/支持批量/可跨网段)
    [原创]K8Cscan插件之FTP弱口令扫描(内网渗透/支持批量/可跨网段)
    [原创]K8Cscan插件之Web主机扫描(存活主机、机器名、Banner、标题)(内网渗透/支持批量/可跨网段)
    [原创]K8Cscan插件之存活主机扫描(内网渗透/支持批量/可跨网段)
    [原创]K8 Jboss jmx-console getshell exploit
    [原创]K8Cscan插件之C段旁站扫描子域名扫描
    [原创]K8mysqlCmd数据库免驱连接工具
    [原创]k8exe2bat任意文件转Bat工具(WebShell无法上传EXE解决方案)
    Tensorflow 笔记:第一讲
    数据结构的C语言基础
  • 原文地址:https://www.cnblogs.com/eaglegeek/p/4557988.html
Copyright © 2020-2023  润新知