package com.myandroid;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextView text = (TextView) findViewById(R.id.text); String httpURL = "http://192.168.1.7:8080/qq"; // android中的get方式提交中文会出现乱码
String resData = ""; // 拿到服务器返回的数据
URL url = null; try {
url = new URL(httpURL); // 基于一个字符串网络路径创建一个URL对象
} catch (MalformedURLException e) {
e.printStackTrace();
} if (url != null) { // 代表url是是格式是正确的
try {
HttpURLConnection connection = (HttpURLConnection) url
.openConnection(); // 创建一个网络链接,但是并没有开启链接(准备链接)
InputStreamReader inputStream = new InputStreamReader(
connection.getInputStream()); // 这行代码才是真正访问网页并且获取当前网页内容的字节流
BufferedReader bufferReader = new BufferedReader(inputStream); // 缓冲字符读取器,它在这里的好处是我们下面的代码不用再一个一个字节的读取 String strLine = null;
while ((strLine = bufferReader.readLine()) != null) { // 字符读取器特别的功能,一行一行的读取
resData += strLine + "\n"; // 和前面讲到的sax或者pull读取XML显示的有区别,在读取XML的时候,我们不需要加入换行符
} // 关闭各种接口
bufferReader.close(); // 流的关闭原则,先打开的后关闭
// bufferReader->inputStream->connection
inputStream.close();
connection.disconnect(); // 关闭connection连接 // 显示读取的类容
String res = (resData == null) ? "没有读取到任何内容" : resData; // 使用三目运算符来判断服务器返回的数据是否为null,如果null显示指定的字符串内容
text.setText(res); } catch (IOException e) {
e.printStackTrace();
}
} } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}}
布局文件是
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world" /></RelativeLayout>
Manifest是
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myandroid"
    android:versionCode="1"
    android:versionName="1.0" >    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="14" />    <uses-permission android:name="android.permission.INTERNET" /> <!-- 开启网络链接必须加入此属性 -->    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.myandroid.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application></manifest>
在运行的log时候报错03-11 16:23:16.173: E/AndroidRuntime(21567): FATAL EXCEPTION: main
03-11 16:23:16.173: E/AndroidRuntime(21567): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myandroid/com.myandroid.MainActivity}: android.os.NetworkOnMainThreadException
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.os.Looper.loop(Looper.java:137)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.app.ActivityThread.main(ActivityThread.java:4424)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at java.lang.reflect.Method.invokeNative(Native Method)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at java.lang.reflect.Method.invoke(Method.java:511)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at dalvik.system.NativeStart.main(Native Method)
03-11 16:23:16.173: E/AndroidRuntime(21567): Caused by: android.os.NetworkOnMainThreadException
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.io.IoBridge.connect(IoBridge.java:112)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at java.net.Socket.connect(Socket.java:848)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:77)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at com.myandroid.MainActivity.onCreate(MainActivity.java:39)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.app.Activity.performCreate(Activity.java:4465)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-11 16:23:16.173: E/AndroidRuntime(21567):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
03-11 16:23:16.173: E/AndroidRuntime(21567):  ... 11 more
但是如果运行教程的文件就不会报错了,能正常运行也能正常获取值,我用的Tomcat6,Tomcat也是正常运行的求解?

解决方案 »

  1.   

    你应该把HttpURLConnection放在异步线程中,等获取到数据之后通过Handler发送给主线程,你这样写如果网络很慢,岂不是会把界面卡住
    至于你这个错误,是说主线程访问网络异常,没这么写过,不知道有什么问题,目测没啥错误,但记的4.0以后在主线程中访问网络会报这样的异常,不知道是否是这个问题,下面的高手来回答吧
      

  2.   

    这个一会儿又可以一会儿又不行,现在就在getinputstream卡着又不报错有不什么的。getinputstream以下的代码都不执行了,莫名其妙啊。求大神帮助啊
      

  3.   

    设置下超时吧,这样很容易anr。