2017-02-01 3 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

Напишите прослушиватель и отправьте его в ** InstallConnectionTask **, а затем в 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

Инициализировать 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

Я предполагаю, что вы хотите знать, как получить доступ или изменить интерфейс компоненты из метода doInBackground() или фоновый поток, предоставленные AsyncTask или. Для этого вы используете обработчик. Например, в AsyncTask класса инициализации объекта обработчика теперь называем метод handler.post() в doInBackground() метод или в Run() методом резьбы, как показано ниже

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

помнить, чтобы инициализировать обработчик вне doInBackground() или run();

Смежные вопросы