2016-12-07 62 views
-1

試圖展示網頁的Web視圖中某些特定部分,並使用jsoup庫,以便選擇我的預期股利,這是我的代碼:android.os.NetworkOnMainThreadException而不是用的AsyncTask(jsoup)修復

public class MainActivity extends AppCompatActivity { 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_page); 
     WebView webView = (WebView) findViewById(R.id.web); 
     webView.getSettings().setJavaScriptEnabled(true); 

     try { 
      Document document = Jsoup.connect("http://www.memaraneha.ir").get(); 
      Element elements=document.select("div.news-list").first(); 
      String html = elements.toString(); 
      String mime = "text/html"; 
      String encoding = "utf-8"; 
      webView.loadData(html, mime, encoding); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

}} 

但當運行這個得到這個錯誤:經過一番研究android.os.NetworkOnMainThreadException

我知道這是什麼錯誤,以及如何必須用的AsyncTask功能放碼與this question (and not duplicate in my case)我嘗試這一點,但不能正常工作,似乎不可能把解決這個問題這個jsoup代碼在AsyncTask或我不知道如何必須這樣做...

如果有人可以請幫忙。

回答

3

使用的AsyncTask加載文檔的任何方法

public class MainActivity extends AppCompatActivity { 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_page); 
     WebView webView = (WebView) findViewById(R.id.web); 
     webView.getSettings().setJavaScriptEnabled(true); 

     new AsyncTask<Void, Void, String>() { 
      @Override 
      protected String doInBackground(Void... voids) { 
       String html = ""; 
       try { 
        Document document = Jsoup.connect("http://www.memaraneha.ir").get(); 
        Element elements=document.select("div.news-list").first(); 
        html = elements.toString(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       return html; 
      } 

      @Override 
      protected void onPostExecute(String html) { 
       String mime = "text/html; charset=utf-8"; 
       String encoding = "utf-8"; 
       webView.loadData(html, mime, encoding); 
      } 
     }.execute(); 

}} 
+0

無法識別onPostExecute中的webview,然後給.execute();錯誤。 – erfan

+0

將Webview更改爲最終 –

+0

確定webview錯誤消失。但爲.execute()提供錯誤;在onPostExecute。並接受你的答案,請編輯你的代碼,並顯示如何 調用asynctask在創建meathod – erfan

1

你不能在主線程上執行網絡調用,這在過去的幾年(從API 11開始)一直存在於android中,並且在那裏有很好的理由。

如果您在主線程上執行網絡呼叫,您將導致ANR並跳過幀,並且您的用戶將卸載您的應用程序。

你應該使用發送在後臺線程的請求(無論是AsyncTask或任何網絡圖書館有在那裏)

更多,請閱讀this article

+0

我知道應該使用AsyncTask,但我嘗試了很多次,把這個jsoup代碼放在AsyncTask中,但似乎不工作 – erfan

+0

也許jsoup不是正確的網絡庫,你嘗試過使用[OkHttp](https ://github.com/square/okhttp)或[Volley](https://developer.android.com/training/volley/index.html)? – thepoosh

相關問題