求助,使用.getResponseCode()方法抛出异常

Android 码拜 9年前 (2015-05-11) 1136次浏览 0个评论
 

读取网络图片,但是每次都是在执行.getResponseCode()方法的时候抛出异常,快要崩溃了,到底是怎么回事,代码如下:

package com.qxj.lixinxing.service;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import com.qxj.lixinxing.utils.StreamTool;

import android.net.Uri;
import android.util.Log;

public class ImageService {

	public static byte[] getImage(String path) throws Exception {

		URL url = new URL(path);     //得到资源地址
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();   //得到连接
		connection.disconnect();
		connection.setConnectTimeout(5000);     //如果5000毫秒内未连接到就超时
		connection.setRequestMethod("GET");			//以“get”方式发出请求
		//每次执行到下面判断语句的时候就会抛出异常,是怎么回事?
		if(connection.getResponseCode() == 200) {   //如果数据存在,执行下一步
			InputStream inStream = connection.getInputStream();   //得到网络返回的输入流
			return StreamTool.read(inStream);                     //将输入流转换为二进制数据
		}
		return null;
	}

}
把判断语句注释掉,直接得到输入流也会抛出异常,我在配置文件里面添加访问网络权限了的啊
有没有人帮忙看看是怎么回事
30分
把异常也发出来啊
networkonmainthreadexception
30分
很明显了 把网络操作放在线程中操作,这个错误很明显的告诉你 你把网络操作放在了主线程 这是不允许的!你需要另起线程进行网络操作
new thread(){

public void run(){
写上你的那些代码试试!
}

}.start()

10分
connection.disconnect();
你这是要干嘛,断开连接?
10分
引用 6 楼 longer262110 的回复:

connection.disconnect();
你这是要干嘛,断开连接?

是的额,为什么要断开呢

找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。 
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
StrictMode.setThreadPolicy(new 
StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

并且在配置文件中将SDK的最低等级设为11

引用 8 楼 xinxing260 的回复:

找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。 
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将……

这里没有错吗?connection.disconnect();

有用,我也遇到同样的问题
<uses-permission android:name=”android.permission.INTERNET”/>
11楼终结此贴
不对,还是得用8l的方法
引用 8 楼 xinxing260 的回复:

找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。 
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
StrictMode.setThreadPolicy(new 
StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

并且在配置文件中将SDK的最低等级设为11

这个是正解,真的成功了

引用 8 楼 xinxing260 的回复:

找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。 
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
StrictMode.setThreadPolicy(new 
StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

并且在配置文件中将SDK的最低等级设为11

正解啊

引用 8 楼 xinxing260 的回复:

找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。 
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
StrictMode.setThreadPolicy(new 
StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

并且在配置文件中将SDK的最低等级设为11

这个放在MainActivity的什么地方啊

引用 16 楼 laomengzi 的回复:
Quote: 引用 8 楼 xinxing260 的回复:

找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。 
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
StrictMode.setThreadPolicy(new 
StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

并且在配置文件中将SDK的最低等级设为11

这个放在MainActivity的什么地方啊

onCreate方法中

引用 8 楼 xinxing260 的回复:

找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。 
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
StrictMode.setThreadPolicy(new 
StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

并且在配置文件中将SDK的最低等级设为11

感谢LZ自问自答,无私的分享精神!


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求助,使用.getResponseCode()方法抛出异常
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!