2016-04-11 27 views
1

den çağrılmalıdır bir ben alacağını hangi AsyncTask için bir kurucu eklemek zorunda düşününAsyncTask-Yöntem gettext UI Thread

edtUrl.getText().toString(); 

altındaki hata "Yöntem gettext UI Thread gelen çağrılmalıdır" Theres İki Dizeler daha sonra görevinizi oluştururken gönderir? Herhangi bir fikri olan var mı? Sadece bu bilgileri gibi başka SO soru kullanılarak çalıştı ama hiçbir şey

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 + "]"); 
      } 

çalıştı Bu benim onClick olduğunu(), aşağıda hem SITEURL altında Im alma hataları.

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

Bu, kullanmaya çalıştığım benim findViewsById() yöntemidir.

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

hata Projemde bu kodu dahil etmeye çalışırken, benim parseURL yönteminin bir parçası görünür:

Eğer kullanıcının girdiği url almaya çalışırken Görünüşe
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 ile herhangi bir şekilde arka plan iş parçacığıyla etkileşim kurmamalısınız. Bu senin hatan değil, sadece bir kafa. – zgc7009

+0

Ana iş parçacığı üzerinde çalıştırılacak olan runable'ları oluşturabilirsiniz - http://stackoverflow.com/a/11125271/2363967 –

+0

Hangi hatayı alıyorsunuz? –

cevap

0

, ve daha sonra onunla bir şeyler yapmak için bir sunucuya başvurun. Bunu yapmanın yolu, görevinizi oluşturduğunuzda URL'yi göndermek ve Görev içinde doInBackground() yönteminize bir argüman olarak almaktır. (new ParseURL()).execute(siteUrl);

Ve sonra bunları sevdiği doInBackground() yönteminde geri almak istiyorum:

Yani bu ifadeye sitesi url geçerdi

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

hat (String... strings) Eğer herhangi göndermenizi sağlar Dize argümanlarının sayısı ve hangi parametrelerin geçtiğine bağlı olarak bir dinamik dizi oluşturulacaktır. Bu yüzden yalnızca bir String (site URL'si) 'den geçirdiğimizden, 1 parametresi olan bir String dizisi tek parametreyle url ile oluşturulur. Yani şimdi sadece yukarıdaki gibi erişmelisin.

"UI Thread" hatasını almanızın nedeni, UI öğelerini UI iş parçacığı üzerinden değiştiremezsiniz. Ve bir AsyncTask arka planda UI iş parçacığı KAPALI çalıştıran, hata alıyorsunuz. Çözüm, ihtiyaç duyduğunuz verileri, UI iş parçacığı üzerindeyken almaktır, daha sonra bunu oluşturduğunuzda yalnızca Görev'e iletmektir.

Bu sizin için bazı şeyleri açıklığa kavuşturuyor!

3

Yalnızca UI iş parçacığı UI bileşenleri ile çalışabilir. doInbackground(), UI bileşenlerine erişemeyen farklı bir Konu üzerinde çalışır.

Sen modüler olarak dize ayarlayabilir ve doInBackground() yönteminde kullanmak sonra metni almak için OnPreExecute() yöntemini kullanın ve:

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

    . 
    . 
    . 

} 

yardımcı olur Umut.

+0

Yaptıklarını yaptım ama şimdi bir hata alıyorum, bir göz atmak istiyorsanız yukarıdaki cevabımı düzenledim – DylanB