2016-04-11 56 views
1

叫theres一個錯誤下的AsyncTask法的getText必須從UI線程

edtUrl.getText().toString(); 

我想我有一個構造函數添加到的AsyncTask它會使用「方法的getText必須從UI線程調用」兩個字符串然後在創建任務時發送它們?有人有主意嗎?使用另一個SO問題就是這樣的信息嘗試,但沒有奏效

private class ParseURL extends AsyncTask<String, Void, String> { 
     private String siteUrl; 
    @Override 
    protected String doInBackground(String... strings) { 
     StringBuffer buffer = new StringBuffer(); 
     //EditText edtUrl = (EditText) findViewById(R.id.edtURL); 

     //String siteUrl = edtUrl.getText().toString(); 
     try { 
      Log.d("JSwa", "Connecting to ["+strings[0]+"]"); 
      Document doc = Jsoup.connect(strings[0]).get(); 
      Log.d("JSwa", "Connected to ["+strings[0]+"]"); 
      // Get document (HTML page) title 
      String title = doc.title(); 
      Log.d("JSwA", "Title ["+title+"]"); 
      buffer.append("Title: " + title + "\r\n"); 


      try { 
       doc = Jsoup.connect(siteUrl) 
         .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0") 
         .referrer("http://www.google.com") 
         .timeout(1000 * 5) //it's in milliseconds, so this means 5 seconds. 
         .get(); 
      } catch (Throwable t) { 
       t.printStackTrace(); 
      } 

      Elements tableElements = doc.select("td"); 
      for (Element td : tableElements) { 
       buffer.append("TT [" + td + "] \r\n"); 
       Log.d("JSwA", "TT [" + td + "]"); 
      } 

這是我的onClick(),均低於SITEURL下即時得到錯誤。

 @Override 
     public void onClick(View view) { 
      // String siteUrl = edtUrl.getText().toString(); 
      siteUrl = "http://www.w3schools.com/html/html_tables.asp"; 
      (new ParseURL()).execute(new String[]{siteUrl}); 

這是我嘗試使用的findViewsById()方法。

  protected void onPreExecute() { 
     super.onPreExecute(); 
     EditText edtUrl = (EditText) findViewById(R.id.edtURL); 
     siteUrl = edtUrl.getText().toString(); 
    } 

錯誤出現在試圖將這一代碼到我的項目,這是我的parseURL方法的一部分:

try { 
     doc = Jsoup.connect(siteUrl) 
       .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0") 
       .referrer("http://www.google.com") 
       .timeout(1000 * 5) //it's in milliseconds, so this means 5 seconds. 
       .get(); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 
+0

您不應該以任何方式與後臺線程交互UI。這並不是你的錯誤,而只是一個小小的問題。 – zgc7009

+0

您可以創建將在主線程上執行的runnables - http://stackoverflow.com/a/11125271/2363967 –

+0

你會得到什麼錯誤? –

回答

0

它看起來像你正試圖獲取用戶輸入的URL,然後聯繫服務器來處理它。這樣做的方法是在創建任務時發送URL,然後將其作爲參數在您的任務中作爲參數進行檢索。

所以,你會在網站的網址通過與這樣的說法:(new ParseURL()).execute(siteUrl);

然後你會在你的doInBackground()方法這樣獲取:

@Override 
protected String doInBackground(String... strings) { 
    String siteUrl = strings[0]; 
} 

(String... strings)讓你在任何發送因爲我們只傳入了一個字符串(我們的站點url),所以創建一個大小爲1的字符串數組,並將我們的url作爲唯一參數。所以現在你只需要像上面那樣訪問它。

您得到「UI線程」錯誤的原因是因爲您無法從UI線程操縱UI元素。並且由於AsyncTask在後臺運行OFF UI線程,您會收到錯誤消息。解決方案是在UI線程中獲取所需的數據,然後在創建它時將它傳遞給Task。

希望能爲您澄清事情!

3

只有UI線程可以與UI組件一起使用。 doInbackground()在不能訪問UI組件的不同Thread上運行。

您可以設置該字符串模塊化和使用onPreExecute()方法來獲取文本,然後使用它在doInBackground()方法:

private class ParseURL extends AsyncTask<String, Void, String> { 
    private String siteUrl; 

    . 
    . 
    . 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     EditText edtUrl = (EditText) findViewById(R.id.edtURL); 
     siteUrl = edtUrl.getText().toString(); 
    } 


@Override 
protected String doInBackground(String... strings) { 
    try { 
     doc = Jsoup.connect(siteUrl) 
      .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0") 
      .referrer("http://www.google.com") 
      .timeout(1000 * 5) //it's in milliseconds, so this means 5 seconds. 
      .get(); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 

    . 
    . 
    . 

} 

希望它能幫助。

+0

我做了你做的,但現在得到一個錯誤,我編輯了我的答案,上面如果你想看看 – DylanB

相關問題