/ / É uma boa prática passar um objeto de Atividade Android para um construtor de classe Thread? - android, multithreading, android-activity

É uma boa prática passar um objeto da Atividade do Android ao construtor da classe Thread? - Android, multithreading, android-atividade

Ao escrever uma atividade Android que enviaentradas de consultas para um servidor web, eu estava pensando em vez de ter uma classe interna anônima para definir o segmento de rede, por que não podemos usar uma classe separada que estende Thread.

Embora funcione conforme o esperado, gostaria de saber se isso é uma prática boa ou ruim.

public class GreetActivity extends Activity{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_greet_activity);
}

public void onClickBtn(View v){
Thread t = new WorkerThread("http://10.0.2.2:8080",this);
t.start();
}
}

class WorkerThread extends Thread{
private String targetURL;
private Activity activity;

public WorkerThread(String url, Activity act){
this.activity = act;
this.targetURL = url;
}

public void run(){
TextView tv = (TextView) activity.findViewById(R.id.textview1);
. . . . . .
}

}

Respostas:

1 para resposta № 1
  1. Passando um Activity a referência a um tópico tem algumas ressalvas.O ciclo de vida da atividade é separado do ciclo de vida do encadeamento. As atividades podem ser destruídas e recriadas, por exemplo por eventos de mudança de orientação. Se a referência de atividade for mantida em um encadeamento, os recursos mantidos pela atividade (muitos ativos de bitmap, por exemplo, ocupando muita memória) não podem ser coletados como lixo.

    Uma classe interna não estática também tem o mesmo problema, pois a referência ao pai é implícita.

    Uma solução de trabalho é limpar a referência de atividade quando a atividade é destruída e fornecer uma nova referência de atividade quando a atividade é recriada.

  2. Você só pode tocar em seus widgets de IU no encadeamento de IU, conforme mencionado por blackbelt.

Por que vale a pena, um AsyncTask é mais fácil de trabalhar do que um esqueleto Thread.


1 para resposta № 2

No seu caso, não, não é, já que apenas o UI Thread pode tocar a IU, seu código fará seu aplicativo travar com

android.view.ViewRoot$CalledFromWrongThreadException