2016-12-07 91 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

相关问题