Android: чтение HTML веб-страницы в строку - PullRequest
3 голосов
/ 29 декабря 2011

Я новичок в разработке Android и пытаюсь прочитать HTML-код веб-страницы, сохранить его в строке («myHTML») ниже и отобразить в приложении.

Однако приложение завершается при каждом запуске. Я бродил по Интернету по этой причине и наткнулся на несколько статей, в которых говорится, что доступ к Интернету не может быть сделан в основном потоке пользовательского интерфейса приложения из-за его «дорогой» природы. Кто-нибудь сталкивался с подобной проблемой раньше? Я был бы признателен за любую дополнительную информацию по этой проблеме ... на начальном уровне:)

Вот программа:

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

Ответы [ 2 ]

11 голосов
/ 29 декабря 2011

Вы можете использовать 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: Общий класс для AsyncTask в Android?

1 голос
/ 29 декабря 2011

Первая проблема заключается в том, что вы блокируете поток пользовательского интерфейса при запросе страницы. Скорее всего, вы получите ANR во время onCreate. Попробуйте использовать AsyncTask для такого рода вещей.

Кроме того, убедитесь, что вы заявили о разрешении доступа в Интернет в манифесте.

Пожалуйста, опубликуйте свой вывод logcat, чтобы мы могли лучше понять проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...