2013-01-19 24 views
9

好吧,所以我刚接触android,我想从网页获取整个文本为字符串。我发现了很多像这样的问题,但正如我所说我是Android新手,我不知道如何在我的应用程序中使用它们。我收到错误。只有一种方法我设法使它工作,它使用WebView和JavaScript,并且它速度很慢。有人可以告诉我一些其他的方式来做到这一点或如何加快WebView,因为我根本没有使用它来查看内容。 BTW我已经添加以下代码,以加快的WebView从网页获取文本到字符串

webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setBlockNetworkImage(true); 
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false); 
    webView.getSettings().setPluginsEnabled(false); 
    webView.getSettings().setSupportMultipleWindows(false); 
    webView.getSettings().setSupportZoom(false); 
    webView.getSettings().setSavePassword(false); 
    webView.setVerticalScrollBarEnabled(false); 
    webView.setHorizontalScrollBarEnabled(false); 
    webView.getSettings().setAppCacheEnabled(false); 
    webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 

并请,如果你知道除了使用的WebView更好,更快的解决方案请给我主要活动的全部源代码或说明在何处,我应该写它,所以我没有得到错误..预先感谢!

+0

如果你只想文本出特定HTML元素的,你可以看看[JSoup(http://jsoup.org/)。 –

回答

27

使用此运行任务:

public class ReadWebpageAsyncTask extends Activity { 
    private TextView textView; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     textView = (TextView) findViewById(R.id.TextView01); 
    } 

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) { 
      String response = ""; 
      for (String url : urls) { 
       DefaultHttpClient client = new DefaultHttpClient(); 
       HttpGet httpGet = new HttpGet(url); 
       try { 
        HttpResponse execute = client.execute(httpGet); 
        InputStream content = execute.getEntity().getContent(); 

        BufferedReader buffer = new BufferedReader(
          new InputStreamReader(content)); 
        String s = ""; 
        while ((s = buffer.readLine()) != null) { 
         response += s; 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return response; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      textView.setText(Html.fromHtml(result)); 
     } 
    } 

    public void readWebpage(View view) { 
     DownloadWebPageTask task = new DownloadWebPageTask(); 
     task.execute(new String[] { "http://www.google.com" }); 

    } 
} 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 

    <Button android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/readWebpage" android:onClick="readWebpage" android:text="Load Webpage"></Button> 
    <TextView android:id="@+id/TextView01" android:layout_width="match_parent" android:layout_height="match_parent" android:text="Example Text"></TextView> 
</LinearLayout> 
+0

如何阅读http://ddceutkal.org/SSDC_GD.pdf @K_Anas的内容并在某些textview中显示-nulll –

+1

所有已弃用的内容... –

2

看你有没有兴趣在所有观看的内容,请尝试使用以下:

为了从您可以使用此一网址获取源代码:

HttpClient httpclient = new DefaultHttpClient(); // Create HTTP Client 
HttpGet httpget = new HttpGet("http://yoururl.com"); // Set the action you want to do 
HttpResponse response = httpclient.execute(httpget); // Executeit 
HttpEntity entity = response.getEntity(); 
InputStream is = entity.getContent(); // Create an InputStream with the response 
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
StringBuilder sb = new StringBuilder(); 
String line = null; 
while ((line = reader.readLine()) != null) // Read line by line 
    sb.append(line + "\n"); 

String resString = sb.toString(); // Result is here 

is.close(); // Close the stream 

制作确保你在AsyncTaskThread的主UI线程中运行此功能。

5

这是代码,我一般使用从互联网上

class RequestTask extends AsyncTask<String, String, String>{ 

@Override 
// username, password, message, mobile 
protected String doInBackground(String... url) { 
    // constants 
    int timeoutSocket = 5000; 
    int timeoutConnection = 5000; 

    HttpParams httpParameters = new BasicHttpParams(); 
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
    HttpClient client = new DefaultHttpClient(httpParameters); 

    HttpGet httpget = new HttpGet(url[0]); 

    try { 
     HttpResponse getResponse = client.execute(httpget); 
     final int statusCode = getResponse.getStatusLine().getStatusCode(); 

     if(statusCode != HttpStatus.SC_OK) { 
      Log.w("MyApp", "Download Error: " + statusCode + "| for URL: " + url); 
      return null; 
     } 

     String line = ""; 
     StringBuilder total = new StringBuilder(); 

     HttpEntity getResponseEntity = getResponse.getEntity(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(getResponseEntity.getContent())); 

     while((line = reader.readLine()) != null) { 
      total.append(line); 
     } 

     line = total.toString(); 
     return line; 
    } catch (Exception e) { 
     Log.w("MyApp", "Download Exception : " + e.toString()); 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(String result) { 
    // do something with result 
} 
} 

下载一个字符串,你可以用

new RequestTask().execute("http://www.your-get-url.com/");

+0

据我所知,我应该把新的RequestTask()放在onCreate()和onCreate()之外的其他代码上吗?如果这是正确的,我在TAG上发生错误 - TAG无法解析为变量。如何解决这个问题?和字符串行是从页面右侧的整个文本? – null

+0

是的。字符串行是整个响应字符串。而TAG只是我之前定义的一个字符串变量。用你的巧克力串代替它。我修改了我的答案。是的,当你想开始下载时,你可以把新的RequestTask()放在任何地方。 –