0

私はAndroidプログラミングにかなり慣れていませんが、iOS用のプログラミングには慣れています...

これで、iOSにNSStringstringWithContentOfURLの関数があります。さて、私の質問は、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)
4

2 に答える 2

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 についても同様です。詳細については、AsyncTaskをご覧ください。のインターフェイスAsyncTaskは少し鈍い私見です。

について特別なことは何もありませんAsyncTask。スレッドの作成と、結果に基づくユーザー インターフェイスの更新に関するパターンをラップしています。昔はこんな風にやっていたのですが、

new Thread(new Runnable() { 
  @Override
  public void run() {
    // do network operation
    runOnUiThread(new Runnable() {
      @Override
      public void run() {
        // update UI thread here
      }
    });
  }
}}.start();
于 2013-01-22T18:40:04.000 に答える
0

Android は、UI スレッドでネットワーク操作を行うべきではないと言っています。正当な理由で、スレッドをブロックしてほしくありません。

AsyncTask代わりにを使用してみてください。HTTP 要求コードをdoInBackground()メソッドに入れ、メソッドで を更新しTextViewますonPostExecute()

メソッドから UI スレッドにアクセスできないことに注意してくださいdoInBackground()

于 2013-03-03T17:39:54.903 に答える