2017-02-01 41 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中首先實現這個監聽器,在它的override方法中你可以設置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

初始化TextView裏面的onCreate()和你的Button一樣。傳textView,以Asynctask使用類Constructor

完全解決代碼:

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類:

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

我假設你想知道,如何訪問或更改UI來自doInBackground()方法或後臺線程的組件,提供了AsyncTask或。爲了達到這個目的你使用一個處理程例如,在類的AsyncTask初始化處理程序 的目的現在請方法handler.post()在doInBackground()方法或在運行()線程的方法如下面

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

記住初始化doInBackground外的處理程序()或run()方法;