2012-10-24 96 views
1

我有一個代碼,從我的本地主機加載文本文件,我使用xampp,我把我的文件放在htdocs下的xampp文件夾中。這裏是我的代碼:ANDROID - 從本地讀取文件(錯誤)

public class MainActivity extends Activity { 

TextView httpStuff; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    httpStuff = (TextView)findViewById(R.id.tvHttp);   
    try { 
     URL url = new URL("http://10.0.2.2/name.txt"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));   
     String str = in.readLine(); 
     in.close(); 
     httpStuff.setText(str); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    }catch (IOException e) { 
     // TODO: handle exception 
    } 

}} 

我得到這個錯誤。我不知道什麼是錯的。我還在我的androidmanifest.xml文件中添加了權限互聯網。

10-24 17:17:45.024: E/AndroidRuntime(7544): FATAL EXCEPTION: main 
10-24 17:17:45.024: E/AndroidRuntime(7544): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.name.in.a.textfile/com.example.name.in.a.textfile.MainActivity}: android.os.NetworkOnMainThreadException 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.os.Looper.loop(Looper.java:137) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at dalvik.system.NativeStart.main(Native Method) 
10-24 17:17:45.024: E/AndroidRuntime(7544): Caused by: android.os.NetworkOnMainThreadException 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.io.IoBridge.connect(IoBridge.java:112) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at java.net.Socket.connect(Socket.java:842) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:76) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at java.net.URL.openStream(URL.java:462) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at com.example.name.in.a.textfile.MainActivity.onCreate(MainActivity.java:27) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.app.Activity.performCreate(Activity.java:5008) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
10-24 17:17:45.024: E/AndroidRuntime(7544):  ... 11 more 
+0

什麼是'這個錯誤'?將此添加到'catch(IOException e)'子句:'e.printStackTrace();'併發布logcat的輸出 –

+0

我只是更新了問題。我只是做了你所說的,這就是記錄的結果。 – jeponkz

+0

你的問題是** NetworkOnMainThreadException **,改變,所以你不要在主線程中做你的網絡通信,而是實現一個AsyncTask例如。 – kaderud

回答

3

您的問題是出在這一行 android.os.NetworkOnMainThreadException 10-24 17:07:44.745: E/AndroidRuntime(7143)

在Android中,在主線程中您不能執行的網絡行爲,因爲它可能無法更新爲5秒以上阻止用戶界面,會導致應用不迴應。

你應該做這樣的事情(未測試) 的try塊應該是:

Thread t = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     URL url = new URL("http://10.0.2.2/name.txt"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));   
     String str = in.readLine(); 
     in.close(); 
     runOnUIThread(new Runnable() { 
      @Override 
      public void run() { 
       httpStuff.setText(str); 
      } 
     }); 

    }); 
t.start(); 

執行不同的線程聯網,但這樣一來,因爲你需要更新一次聯網的UI完成後,您需要使用runOnUIThread,因爲在UI上Thread可以更新UI組件。

另外,可能更好的選擇是AsyncTask 你把你的網絡任務,在其doInBackground方法,並更新onPostExecute方法的UI,這樣你就不需要更動線程。基本上AsyncTask做了我上面描述的。你應該研究這一點,因爲所有的網絡應該用不同的線程來完成,AsyncTask是一個非常簡單的選擇。