2017-02-01 6 views
0

textViewのテキストをウェブサイトのタイトルに合わせて変更します。バックグラウンドスレッドからtextViewプロパティを変更する方法

このため、https://www.google.comに接続し、そのHTMLソースコードを取得しています。それからタイトルタグを取り出します。 (JSoupを使用して)

問題は、今私はどのようにtextViewを変更するか分からないということです。ネットワーキングはバックグラウンドスレッドで起こっているため、アクセスできません。どこでどのようにすればいいですか?

また、Log.wのおかげで正常に接続されていることがわかりました。

は、ここで私が持っているものです。

MainActivity

public class MainActivity extends AppCompatActivity { 

    Button btnConnect; 

    final String URL = "https://www.google.com"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     btnConnect = (Button) findViewById(R.id.btnConnect); 
     btnConnect.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // launch networking task 
       new EstablishConnectionTask().execute(URL); 
      } 
     }); 


    } 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.awakened.tirafesi.awakenedprototype.MainActivity"> 

    <Button 
     android:text="Establish Connection" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/btnConnect" /> 

    <TextView 
     android:text="Placeholder" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="87dp" 
     android:id="@+id/txtTitle" /> 
</RelativeLayout> 

EstablishConnectionTask

public class EstablishConnectionTask extends AsyncTask<String, Void, String> { 


    @Override 
    protected String doInBackground(String... urls) { 

     String title; 

     try { 
      Document doc = Jsoup.connect(urls[0]).get(); 
      title = doc.title(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
      title = "NO"; 
     } 

     return title; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 

     Log.w("Title", s); 
    } 
} 
+0

リスナーを作成して** EstablishConnectionTask **に送信し、次にonPostExecuteでインターフェイスメソッドを呼び出します。 MainActivityでは最初にそのリスナーを実装し、オーバーライドメソッドでtextViewのタイトルを設定できます。 – eminuluyol

+1

何が@eminuluyolによると、この質問は、コード例を示します:http://stackoverflow.com/questions/9447646/how-do-i-send-data-back-from-onpostexecute-in-an-asynctask – RScottCarson

+0

私はそれを得る...どのようにMainActivityのインターフェイスメソッドのオーバーライドは、onPostExecuteのインターフェイス上の呼び出しに影響を与えますか?あなたはそれのコードを追加してもよろしいですか? – Tirafesi

答えて

1

の場合と同じようにonCreate()の内部にTextViewを初期化します。私はUIにアクセスしたり変更する方法を、あなたは知っているしたいと仮定しています

public class EstablishConnectionTask extends AsyncTask<String, Void, String> { 

public TextView textView; 

//constructor to pass textView 
public EstablishConnectionTask(TextView textView){ 
    this.textView = textView; 
} 

@Override 
protected String doInBackground(String... urls) { 

    String title; 
    try { 
     Document doc = Jsoup.connect(urls[0]).get(); 
     title = doc.title(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
     title = "NO"; 
    } 
    return title; 
} 

@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 
    textView.setText(s); // add title to textView 

    Log.w("Title", s); 
} 
} 
0

完全な解決コード:

public class MainActivity extends AppCompatActivity { 

Button btnConnect; 
TextView textView; 

final String URL = "https://www.google.com"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    textView = (TextView) findViewById(R.id.txtTitle); 
    btnConnect = (Button) findViewById(R.id.btnConnect); 
    btnConnect.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      //pass TextView of this class to Asynctask cass 
      new EstablishConnectionTask(textView).execute(URL); 
     } 
    }); 
    } 
} 

AsynctaskクラスクラスConstructorを使用してAsynctaskに、textViewを渡しdoInBackground()メソッドまたはバックグラウンドスレッドのコンポーネント。AsyncTaskまたはAsyncTaskを提供します。これを実現するには、ハンドラを使用します。例えば、AsyncTaskクラスにハンドラ のオブジェクトを初期化する今

Handler handler = new Handler(); 
handler.post(new Runnable{ 
@overide 
public void run(){ 
    textView.setText("Changed"); 
} 
}); 

以下のようなスレッドのdoInBackground()メソッドまたは実行中()メソッドでdoInBackground外ハンドラを初期化することを忘れないでください)(メソッドを呼び出すhandler.post ()またはrun()メソッドを呼び出します。

関連する問題