2013-01-22 50 views
0

我很新到Android編程閱讀的文本,但我已經習慣了編程的iOS雖然...的Android從網站

現在的iOS你的NSString stringWithContentOfURL的功能。現在我的問題是,如果在java中有類似的選項以及...?雖然在谷歌搜索我已經通過一些例子,但使用它們我的應用程序總是崩潰...

我使用這樣的代碼:http://www.coderzheaven.com/2011/07/17/how-to-read-webpage-contents-as-a-string-in-android/,但它不斷崩潰...你能幫我嗎?

謝謝!

編輯: logcat的錯誤:

01-22 19:34:12.718: E/AndroidRuntime(5481): FATAL EXCEPTION: main 
01-22 19:34:12.718: E/AndroidRuntime(5481): android.os.NetworkOnMainThreadException 
01-22 19:34:12.718: E/AndroidRuntime(5481): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
01-22 19:34:12.718: E/AndroidRuntime(5481): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
01-22 19:34:12.718: E/AndroidRuntime(5481): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
01-22 19:34:12.718: E/AndroidRuntime(5481): at java.net.InetAddress.getAllByName(InetAddress.java:220) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:653) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at com.example.test4.DieActivity.meldeAn(DieActivity.java:150) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at com.example.test4.DieActivity$1.onClick(DieActivity.java:56) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at android.view.View.performClick(View.java:3511) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at android.view.View$PerformClick.run(View.java:14105) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at android.os.Handler.handleCallback(Handler.java:605) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at android.os.Looper.loop(Looper.java:137) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-22 19:34:12.718: E/AndroidRuntime(5481):  at dalvik.system.NativeStart.main(Native Method) 
+1

顯示Logcat錯誤會很有幫助。但在黑暗中刺中,你有沒有在你的Manifest文件中聲明Internet權限? '<使用權限android:name =「android.permission.INTERNET」/>' –

+0

是的,它被聲明和我的錯誤在編輯。 –

回答

2

你試圖在UI線程上執行(網絡)IO。這是不允許的。爲什麼?因爲如果你掛在UI線程,系統會發佈一個ANR(活動不響應)對話框,用戶..

必須執行異步IO,

new AysyncTask<String,Void,String>() { 
      protected String doInBackground(String... urls) { 
       String url = urls[0]; 
       // do network operation, get result in a string (for example) 
       return resultString; 
      } 

      protected void onPostExecute(String result) { 
       JSONObject jo = new JSONObject(result); 
       // update UI with the results of the network call here 
      } 
     }.execute(aUrl); 

這是網絡尤其重要IO,但它也適用於磁盤IO。詳情請看AsyncTaskAsyncTask的接口是一個小傻瓜恕我直言。

AsyncTask沒有什麼特別之處,它圍繞創建線程和根據結果更新用戶界面的方式進行包裝。在過去,我們曾經這樣做,

new Thread(new Runnable() { 
    @Override 
    public void run() { 
    // do network operation 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
     // update UI thread here 
     } 
    }); 
    } 
}}.start(); 
+0

爲我工作過,謝謝! –

0

Android是告訴你,你不應該在UI線程上進行網絡操作。它不希望你阻止線程,並有很好的理由。

嘗試使用AsyncTask代替。將您的HTTP請求代碼放在doInBackground()方法中,並在onPostExecute()方法中更新TextView

請記住,您不能訪問從doInBackground()方法的UI線程。