2013-01-19 28 views
9

Được rồi, vì vậy tôi mới sử dụng Android và tôi muốn tải toàn bộ văn bản từ trang web vào chuỗi. Tôi đã tìm thấy rất nhiều câu hỏi như thế này nhưng như tôi đã nói tôi mới sử dụng Android và tôi không biết cách sử dụng chúng trong ứng dụng của mình. Tôi đang gặp lỗi. Chỉ có một phương pháp tôi quản lý để làm cho nó hoạt động, nó sử dụng WebView và JavaScript và nó chậm như địa ngục. Có thể ai đó xin vui lòng cho tôi biết một số cách khác để làm điều này hoặc làm thế nào để tăng tốc độ WebView kể từ khi tôi không sử dụng nó ở tất cả cho xem nội dung. BTW Tôi đã thêm đoạn mã sau để tăng tốc độ WebViewNhận văn bản từ trang web tới chuỗi

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); 

Và xin vui lòng nếu bạn biết giải pháp khác tốt hơn và nhanh hơn so với sử dụng WebView xin vui lòng cho tôi mã nguồn của toàn bộ hoạt động chính hoặc giải thích nơi tôi dự để viết nó vì vậy tôi không nhận được lỗi .. Cảm ơn trước !!

+0

Nếu bạn muốn chỉ là văn bản ra khỏi một phần tử html Đặc biệt, bạn có thể có một cái nhìn tại [JSoup] (http://jsoup.org/). –

Trả lời

27

Sử dụng này:

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

cách đọc nội dung của http://ddceutkal.org/SSDC_GD.pdf @K_Anas và hiển thị trong một số textview -nulll –

+1

tất cả không được dùng nữa ... –

2

Thấy như bạn không quan tâm đến Xem nội dung ở tất cả, hãy thử sử dụng như sau:

Để có được mã nguồn của bạn từ một URL mà bạn có thể sử dụng này:

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 

Make chắc chắn rằng bạn sẽ tắt chuỗi giao diện người dùng chính này trong một số AsyncTask hoặc trong một Thread.

5

Đây là mã tôi thường sử dụng để tải về một chuỗi từ internet

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 
} 
} 

Và bạn có thể chạy các tác vụ với

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

+0

Khi tôi hiểu tôi nên đặt RequestTask mới() trong onCreate() và mã khác bên ngoài onCreate() phải không? nếu đó là chính xác, tôi nhận được lỗi trên TAG - TAG không thể được giải quyết cho một biến. làm thế nào để sửa lỗi này? và chuỗi là toàn bộ văn bản từ trang phải không? – null

+0

có. chuỗi ký tự là toàn bộ phản hồi dưới dạng chuỗi. và TAG chỉ là một biến chuỗi mà tôi đã xác định trước đó. thay thế nó bằng bất kỳ chuỗi nào chocie của bạn. Tôi đã sửa đổi câu trả lời của mình. Và có, bạn có thể đặt RequestTask mới() ở bất kỳ đâu khi bạn muốn bắt đầu tải xuống. –

Các vấn đề liên quan