2013-11-20 32 views
0

我在我的大學提供的在線存儲上有一個txt文件,我想在android應用程序中讀取它。我已經設法在Java中這樣做,但是當我在Android中嘗試這樣做時,沒有任何反應。 Eclipse建議改變了代碼,沒有任何工作。請幫助我我是Android開發新手。從url中讀取文件java到android的問題

a.txt文件包含內容:這是一條消息!

這是java代碼:

import java.io.*; 
import java.net.*; 

public class Java_Parser {  

     public static void main(String[] args) throws Exception { 

      URL oracle = new URL("http://cgi.di.uoa.gr/~std10108/a.txt"); 
      BufferedReader in = new BufferedReader(
      new InputStreamReader(oracle.openStream())); 

      String inputLine; 
      while ((inputLine = in.readLine()) != null) 
       System.out.println(inputLine); 
      in.close(); 
     } 
    } 

,輸出爲,因爲它應該是:這是一個消息!

我已將互聯網權限添加到清單,所以它不是問題。 我複製粘貼在Android項目的功能和Eclipse的事實證明這個建議後:

//This a function called when a button is clicked 
public void OnClick(View view){ 


     URL oracle = null; 
     BufferedReader in = null; 
String inputLine; 

     String text=null; 

     try { 
      oracle = new URL("http://cgi.di.uoa.gr/~std10108/a.txt"); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      in = new BufferedReader(
      new InputStreamReader(oracle.openStream())); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


     try { 
      while ((inputLine = in.readLine()) != null) 
       text=text + inputLine; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      in.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


     EditText edittext= (EditText) findViewById(R.id.editText1); 
     edittext.setText(text); 

    } 

應用程序成功地編譯,但是當我嘗試運行它,然後單擊按鈕,它崩潰。你可以幫我嗎?

這是logcat的

> 11-20 17:40:04.089: I/Process(9926): Sending signal. PID: 9926 SIG: 9 
> 11-20 17:50:37.009: D/libEGL(10534): loaded 
> /system/lib/egl/libEGL_mali.so 11-20 17:50:37.014: D/libEGL(10534): 
> loaded /system/lib/egl/libGLESv1_CM_mali.so 11-20 17:50:37.014: 
> D/libEGL(10534): loaded /system/lib/egl/libGLESv2_mali.so 11-20 
> 17:50:37.024: D/(10534): Device driver API match 11-20 17:50:37.024: 
> D/(10534): Device driver API version: 10 11-20 17:50:37.024: 
> D/(10534): User space API version: 10 11-20 17:50:37.024: D/(10534): 
> mali: REVISION=Linux-r2p4-02rel0 BUILD_DATE=Tue Oct 16 15:37:13 KST 
> 2012 11-20 17:50:37.054: D/OpenGLRenderer(10534): Enabling debug mode 
> 0 11-20 17:50:39.449: D/AndroidRuntime(10534): Shutting down VM 11-20 
> 17:50:39.449: W/dalvikvm(10534): threadid=1: thread exiting with 
> uncaught exception (group=0x416d22a0) 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): FATAL EXCEPTION: main 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): java.lang.IllegalStateException: Could not 
> execute method of the activity 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): at 
> android.view.View$1.onClick(View.java:3704) 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): at 
> android.view.View.performClick(View.java:4232) 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): at 
> android.view.View$PerformClick.run(View.java:17318) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> android.os.Handler.handleCallback(Handler.java:615) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> android.os.Handler.dispatchMessage(Handler.java:92) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> android.os.Looper.loop(Looper.java:137) 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): at 
> android.app.ActivityThread.main(ActivityThread.java:4921) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> java.lang.reflect.Method.invokeNative(Native Method) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> java.lang.reflect.Method.invoke(Method.java:511) 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): at 
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
> 11-20 17:50:39.454: E/AndroidRuntime(10534): at 
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> dalvik.system.NativeStart.main(Native Method) 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): Caused by: 
> java.lang.reflect.InvocationTargetException 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): at 
> java.lang.reflect.Method.invokeNative(Native Method) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> java.lang.reflect.Method.invoke(Method.java:511) 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): at 
> android.view.View$1.onClick(View.java:3699) 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): ... 11 more 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): Caused by: 
> android.os.NetworkOnMainThreadException 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): at 
> android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118) 
> 11-20 17:50:39.454: E/AndroidRuntime(10534): at 
> java.net.InetAddress.lookupHostByName(InetAddress.java:385) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> java.net.InetAddress.getAllByName(InetAddress.java:214) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
> 11-20 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
> 11-20 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 
> 11-20 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
> 11-20 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
> 11-20 17:50:39.454: E/AndroidRuntime(10534): at 
> libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
> 11-20 17:50:39.454: E/AndroidRuntime(10534): at 
> java.net.URL.openStream(URL.java:462) 11-20 17:50:39.454: 
> E/AndroidRuntime(10534): at 
> com.example.test.MainActivity.OnClick(MainActivity.java:55) 11-20 
> 17:50:39.454: E/AndroidRuntime(10534): ... 14 more 

EDIT1:我加入了上網權限,但什麼都沒有改變

+0

獲取從logcat中崩潰的堆棧跟蹤和編輯您的問題,包括這一點。我的猜測是,你沒有包括你的應用程序的互聯網許可 – dymmeh

+0

可能是服務器拒絕連接。發佈你的stacktrace到問題 –

+0

Sry,但我是Android新手,這可能是一個愚蠢的問題:什麼是堆棧跟蹤,我如何訪問它? – JmRag

回答

1

在onCreate方法添加以下代碼: -

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

StrictMode.setThreadPolicy(policy); 

內容添加到manifest資源配置文件:

<uses-permission android:name="android.permission.INTERNET"/> 
+0

雖然這可以解決他的問題,但在UI線程上運行網絡調用的做法很差。 –

+0

直到你或者我找到一個好習慣爲止 –

+0

它已經被髮布爲答案。使用AsyncTask是要走的路線。 –

0

是否設置在AndroidManifest.xml正確的權限?例如,需要android.permission.INTERNET許可:

public static final String INTERNET。 允許應用打開網絡套接字。 常數值:「android.permission.INTERNET對」

出於調試目的,它可以很容易只包所有的代碼在一個try-catch語句,如低於完成:

try { 
    URL oracle = new URL("http://cgi.di.uoa.gr/~std10108/a.txt"); 
    BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream())); 
    String inputLine; 
    while ((inputLine = in.readLine()) != null) 
     System.out.println(inputLine); 
    in.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
+0

在Android應用上工作時,每個人都會忘記至少一次:「android.permission.INTERNET」:P – Voidpaw

+0

我改變了它,但現在的字符串是空的。未讀取單個字符 – JmRag

1

您的問題根源於此異常:android.os.NetworkOnMainThreadException

Android系統保護長塊的UI線程中使用互聯網,以防止不響應的應用程序。要在主線程上正確下載文件,您需要使用某種異步線程來下載文件並對主線程執行回調以處理該文件。

首先查看AsyncTaskhere或在本網站上搜索本身的例外以幫助查找大量示例。

+0

僅供參考,最好是聲明處理此作業的線程? – JmRag

0

oracle.openConnection.getInputStream()會更適合..

0

您可以在服務器上使用PHP文件來顯示它。

首先,你必須創建一個webview。

在PHP文件寫入以下代碼:

<!doctype html> 
<html xmlns="http://w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <meta http-equiv="Cache-Control" content="no-Cache" /> 
    <title>Somewhat</title> 
    <style type="text/css">body {font-family: sans-serif;}</style> 
</head> 

<body> 
    <?php 
     $yourfile = fopen("path/to/file.txt", "r"); 
     $contentoffile = fread($yourfile, 1024); 
     fclose($yourfile); 
    ?> 
    <p><?php echo $contentoffile; ?></p> 
</body>