2016-04-11 9 views
1

から呼び出さなければなりませんが、私は私が取ることになるAsyncTaskにコンストラクタを追加する必要が考えてAsyncTask-法のgetTextは、UIスレッド

edtUrl.getText().toString(); 

の下にエラー「メソッドのgetTextは、UIスレッドから呼び出さなければなりません」Theresの2つの文字列は、あなたのタスクを作成するときにそれらを送信?誰にでもアイデアはありますか?別のものを使用してみましたので、ちょうどこの情報のような疑問が、何もこれは私のonClick(ある

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

を働いていない)、Imは下記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

メインスレッドで実行されるランナブルを作成することができます - http://stackoverflow.com/a/11125271/2363967 –

+0

あなたはどんなエラーを出していますか? –

答えて

0

あなたは、ユーザーが入力したURLを取得しようとしているように見え、それを使って何かをするためにサーバーに連絡してください。これを行う方法は、タスクを作成するときにURLを送信し、それをタスク内のdoInBackground()メソッドの引数として取得することです。

ですから、この文とサイトのURLを渡します:(new ParseURL()).execute(siteUrl);

そしてあなたは、このようなあなたのdoInBackground()方法でそれを取得することができます。

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

ライン(String... strings)はあなたがいずれかで送信することができますString引数の数、および動的配列は、渡すパラメータによって作成されます。したがって、1つのString(サイトURL)だけを渡したので、唯一のパラメータとしてurlを使用してサイズ1のString配列が作成されます。だから今あなたは上のようにそれにアクセスする必要があります。

「UIスレッド」エラーが発生する理由は、UIスレッドからUI要素を操作できないためです。 AsyncTaskはUIスレッドをバックグラウンドで実行しているため、エラーが発生します。解決策は、UIスレッド上で必要なデータを取得し、作成時にタスクに渡すだけです。

これはあなたのために物事を明確にすることを望みます!

3

UIコンポーネントのみでUIスレッドが動作できます。 doInbackground()は、UIコンポーネントにアクセスできない別のスレッドで実行されます。

あなたはモジュラーとして文字列を設定し、テキストを取得し、doInBackground()メソッドでそれを使用するonPreExecute()メソッドを使用することができます。

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