3

私はAndroid開発が初めてで、ウェブページのHTMLを読み込んで、それを以下の文字列( "myHTML")に保存してアプリに表示しようとしています。Android:ウェブページのHTMLを文字列に読み取る

ただし、アプリケーションは実行されるたびに終了します。私はこれを理由にインターネットをトロールしており、その "高価な"性質のために、アプリケーションのメインUIスレッドでインターネットアクセスを行うことができないと言っている記事が出てきました。誰も以前に同様の問題を抱えていますか?

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.TextView; 
import java.util.ArrayList; 
import java.util.regex.*; 
import java.net.*; 
import java.io.*; 

/* 
    * Gets A webpage's HTML and saves to a string 
    */ 
public String WebPageToHTML(String Webpage) throws IOException{ 
    URL x = new URL(Webpage); 
    BufferedReader in = new BufferedReader(
      new InputStreamReader(
      x.openStream())); 
    String y = ""; 
    String inputLine; 
    while ((inputLine = in.readLine()) != null) 
     y = y.concat(inputLine); 
    in.close(); 
    return y;  
} 

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView tv = new TextView(this); 

     String FirstAddress = "http://www.google.com"; 
     String myHTML = ""; 
    try { 
    myHTML = WebPageToHTML(FirstAddress); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    }  
     tv.setText(myHTML); 
     setContentView(tv); 
} 

LOGCAT:

12-29 14:41:44.441: E/AndroidRuntime(540): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.first.app/my.first.app.WhatHaveIMissedActivity}: android.os.NetworkOnMainThreadException 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.os.Looper.loop(Looper.java:137) 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.app.ActivityThread.main(ActivityThread.java:4424) 
12-29 14:41:44.441: E/AndroidRuntime(540): at java.lang.reflect.Method.invokeNative(Native Method) 
12-29 14:41:44.441: E/AndroidRuntime(540): at java.lang.reflect.Method.invoke(Method.java:511) 
12-29 14:41:44.441: E/AndroidRuntime(540): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-29 14:41:44.441: E/AndroidRuntime(540): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-29 14:41:44.441: E/AndroidRuntime(540): at dalvik.system.NativeStart.main(Native Method) 
12-29 14:41:44.441: E/AndroidRuntime(540): Caused by: android.os.NetworkOnMainThreadException 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
12-29 14:41:44.441: E/AndroidRuntime(540): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
12-29 14:41:44.441: E/AndroidRuntime(540): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
12-29 14:41:44.441: E/AndroidRuntime(540): at java.net.InetAddress.getAllByName(InetAddress.java:220) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
12-29 14:41:44.441: E/AndroidRuntime(540): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
12-29 14:41:44.441: E/AndroidRuntime(540): at java.net.URL.openStream(URL.java:462) 
12-29 14:41:44.441: E/AndroidRuntime(540): at my.first.app.WhatHaveIMissedActivity.WebPageToHTML(WhatHaveIMissedActivity.java:71) 
12-29 14:41:44.441: E/AndroidRuntime(540): at my.first.app.WhatHaveIMissedActivity.onCreate(WhatHaveIMissedActivity.java:99) 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.app.Activity.performCreate(Activity.java:4465) 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
12-29 14:41:44.441: E/AndroidRuntime(540): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
12-29 14:41:44.441: E/AndroidRuntime(540): ... 11 more 

答えて

1

つの第一の問題は、ということです私は初心者で...この問題上の任意の詳細については感謝される。ここ

がプログラムです:)レベルページをリクエストするときにUIスレッドをブロックしています。あなたはonCreate中にANRを受け取る可能性があります。そのようなことにAsyncTaskを使ってみてください。

また、マニフェストでインターネットアクセス許可を宣言していることを確認してください。

私たちは問題の良いアイデアを得るためにlogcat出力を投稿してください。

+0

私はマニフェストでINTERNET権限を宣言しているとlogcat出力が利用可能になりました。今私はAsyncTasksを見ていきます。ご協力いただきありがとうございます! –

+1

あなたのlogcatによると、android.os.NetworkOnMainThreadExceptionはまさにそれです:ネットワーキングはメインスレッドで行われますが、これは禁止されています。 – njzk2

10

この情報を要求するには、HttpClientを使用できます。これは同期的に行われますが、非同期要求も作成できます。

String myUri = "http://www.whatever.com"; 
HttpClient httpClient = new DefaultHttpClient(); 
HttpGet get = new HttpGet(myUri); 

HttpResponse response = httpClient.execute(get); 

// Build up result 
String bodyHtml = EntityUtils.toString(response.getEntity()); 

また、次のものをアプリのマニフェストファイルに追加する必要があります。

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

AsyncTaskでこれをラップする方法についての良いスレッドがある:Common class for AsyncTask in Android?

+0

こんにちは、あなたの答えに感謝します。私はこのコードを同期的に実行しようとしましたが、問題は残ります。私は "AsyncTask for Androidの共通クラス"を見ていきます。今。 –

+0

あなたは大歓迎です。デフォルトでは呼び出しによってスレッドがブロックされるため、onCreateはアクティビティが応答しない(ANR)可能性が最も高いです。あなたが示したとおり、解決策は非同期に実行され、完了したコールバックでは、必要なUI更新アクションを実行します。 – Khaos

関連する問題