从网上拿了一个android的天气预报程序来学习,最后run的时候发现提示下面的错误:
按我的调试过程分2步,都是有关网络访问方面的问题。
第一个错误:
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
......
原因:是涉及到url操作的时候,访问网络不能在主程序中运行
解决:参考【http://geeksun.iteye.com/blog/1447708、http://kb.cnblogs.com/a/2311659/】
在Activity类的onCreate方法中添加下面的代码,线程的方法还没测试。
-
publicvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
-
StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder().detectDiskReads()
-
.detectDiskWrites().detectNetwork().penaltyLog().build());
-
StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects()
-
.detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
-
}
Android的官方文档给出了这个类设置的目的:
StrictMode是一个系统提供的开发工具,用以检测在开发过程中因为偶然的事故从而造成的系统潜在的问题,进而提示开发者对其进行修复。
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
显然,大多数初学者在进行网络开发时,会选择将访问网络的代码直接放到主进程中,由于和主进程的首要工作——UI交互——相矛盾,因此,必须设置一定的检测机制,以保证系统运行的流畅,所有的异常都可以被检测。
public static voidsetThreadPolicy(StrictMode.ThreadPolicy policy)
这个方法允许我们为当前应用设置一组线程运行策略机制。其中的参数是一个策略组(即一组策略)。
public static finalclass StrictMode.ThreadPolicy.Builder()
Builder是StrictMode中内嵌类ThreadPolicy的一个内嵌类,在此我们调用了它的默认构造方法。
detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()
通过这种方式,我们设置了一组监控模式,我们要检测磁盘的读写,网络的访问, Log中的违规等。
第二条语句设置了虚拟机的一组监控策略,参数一致,因此不再赘述。
这样,在保证了网络和磁盘访问受控之后,主线程就允许我们对网络资源进行访问。
【参考http://www.2cto.com/kf/201205/129843.html】
第二个错误:
java.lang.nullpointerexception
第一种情况:android4.0中
java.net.unknownhostexception:unable to resolve host "www.google.com":noaddree associated with hostname
debug跟踪是在执行url操作url.openStream()时抛出IOException异常。
第二种情况:android2.2中
java.net.SocketException: Permission denied
........
debug跟踪是在执行url操作url.getInputStream()时抛出IOException异常。
从网上搜索了一下,发现有两个方法:
1、添加dns,参考【http://interzb.iteye.com/blog/1240835】,经测试无效,不是这个原因;
Run Configurations...或者Debug Configurations...打开下面的窗口,在对应项目的Target栏目最后行设置dns
2、Manifest文件没有标明网络访问权限,测试正常,解决问题。
如果确认网络已经正常连接,还出现这个问题,那么看一下Manifest文件是否标明了应用的网络访问权限;如果没有标明,就访问不了网络,就会有这个错误。
在AndroidManifest.xml文件中添加下面的语句:
//<uses-sdk android:minSdkVersion="15" />//在这行后面
<uses-permission android:name="android.permission.INTERNET" />
参考【http://blog.csdn.net/murongshusheng/article/details/7623188】
按我的调试过程分2步,都是有关网络访问方面的问题。
第一个错误:
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
......
原因:是涉及到url操作的时候,访问网络不能在主程序中运行
解决:参考【http://geeksun.iteye.com/blog/1447708、http://kb.cnblogs.com/a/2311659/】
在Activity类的onCreate方法中添加下面的代码,线程的方法还没测试。
-
publicvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
-
StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder().detectDiskReads()
-
.detectDiskWrites().detectNetwork().penaltyLog().build());
-
StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects()
-
.detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
-
}
Android的官方文档给出了这个类设置的目的:
StrictMode是一个系统提供的开发工具,用以检测在开发过程中因为偶然的事故从而造成的系统潜在的问题,进而提示开发者对其进行修复。
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
显然,大多数初学者在进行网络开发时,会选择将访问网络的代码直接放到主进程中,由于和主进程的首要工作——UI交互——相矛盾,因此,必须设置一定的检测机制,以保证系统运行的流畅,所有的异常都可以被检测。
public static voidsetThreadPolicy(StrictMode.ThreadPolicy policy)
这个方法允许我们为当前应用设置一组线程运行策略机制。其中的参数是一个策略组(即一组策略)。
public static finalclass StrictMode.ThreadPolicy.Builder()
Builder是StrictMode中内嵌类ThreadPolicy的一个内嵌类,在此我们调用了它的默认构造方法。
detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()
通过这种方式,我们设置了一组监控模式,我们要检测磁盘的读写,网络的访问, Log中的违规等。
第二条语句设置了虚拟机的一组监控策略,参数一致,因此不再赘述。
这样,在保证了网络和磁盘访问受控之后,主线程就允许我们对网络资源进行访问。
【参考http://www.2cto.com/kf/201205/129843.html】
第二个错误:
java.lang.nullpointerexception
第一种情况:android4.0中
java.net.unknownhostexception:unable to resolve host "www.google.com":noaddree associated with hostname
debug跟踪是在执行url操作url.openStream()时抛出IOException异常。
第二种情况:android2.2中
java.net.SocketException: Permission denied
........
debug跟踪是在执行url操作url.getInputStream()时抛出IOException异常。
从网上搜索了一下,发现有两个方法:
1、添加dns,参考【http://interzb.iteye.com/blog/1240835】,经测试无效,不是这个原因;
Run Configurations...或者Debug Configurations...打开下面的窗口,在对应项目的Target栏目最后行设置dns
2、Manifest文件没有标明网络访问权限,测试正常,解决问题。
如果确认网络已经正常连接,还出现这个问题,那么看一下Manifest文件是否标明了应用的网络访问权限;如果没有标明,就访问不了网络,就会有这个错误。
在AndroidManifest.xml文件中添加下面的语句:
//<uses-sdk android:minSdkVersion="15" />//在这行后面
<uses-permission android:name="android.permission.INTERNET" />
参考【http://blog.csdn.net/murongshusheng/article/details/7623188】
分享到:
相关推荐
Caused by: java.net.UnknownHostException: openapi.alipay.com
linux系统下部署TOMCAT异常错误java.net.UnknownHostException :bogon: bogon 主要原因是主机映射原因 修改hosts文件即可
参考百度Java文档Android Studio模拟定位服务 (安装插件)无法从百度获取地图数据错误显示如下: java.net.UnknownHostException: Unable to resolve host "loc.map.baidu.com": No address associated with ...
consul客户端来进行本地微服务的服务注册和发现的开发测试
jmeter的jmeter-plugins-manager-1.4.jar插件
java HashMapDemo.java
【项目源码】-java网络五子棋游戏 package com.lzw.gobang; import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt....
没有没用的 多多少少都会有帮助的
import java.net.UnknownHostException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java...
Java 网络编程 说明: 网络编程,分为两种一种是TCP、另一种是UDP方式。我们分别写一下TCP、UDP端的Server和Client简单演示代码。 TCP: Sever import java.io.DataInputStream; import java.io.IOException; ...
import java.net.UnknownHostException; public class FileClient { /** * @param args */ public static void main(String[] args) { // 文件的输出流 try { java.io.FileOutputStream fos = new ...
35. import java.net.UnknownHostException; 36. import java.util.Date; 37. import java.util.Scanner; 38. import java.util.Stack; 39. import java.util.prefs.Preferences; 40. 41. import javax.swing...
import java.net.UnknownHostException; public class ClientDemo { public static void main(String[] args) { try { InputStream in = new FileInputStream("D:\\Client"); byte[] buf = new byte[1024*1024...
spring cloud alibaba之nacos、feign服务注册整合示例
import java.net.UnknownHostException; import javax.swing.JOptionPane; public class ChatRoomClent { private Socket s; public ChatRoomClent(String host,int port){ try { s=new Socket(host,port); }...
一段JAVA代码 实现ping功能 import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.nio.channels.SocketChannel;
host:java.net.UnknownHostException: centos-wang: centos-wang: unknown error 在执行hadoop namenode -format命令时,出现未知的主机名。 问题原因: 出现这种问题的原因是Hadoop在格式化HDFS的时候,通过...
import java.net.UnknownHostException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import net.sf.json.JSONArray; import org.apache.commons.codec.binary....
网络编程(TCP) TCP需要连接(三次握手)。发送端也称客户端,接收端也称服务端 1. TCP客户端 Socket类:此类实现客户端套接字...import java.net.UnknownHostException; /* * Socket(InetAddress address, int port)