Хорошо, вы пытаетесь получить доступ к графическому интерфейсу через другой поток. Это, в основном, не является хорошей практикой.
AsyncTask выполняет все в doInBackground()
внутри другого потока, который не имеет доступа к графическому интерфейсу, где ваши представления.
preExecute()
и postExecute()
предлагают вам доступ к графическому интерфейсу до и после тяжелого подъема в этом новом потоке, вы можете даже передать результат длинной операции postExecute()
, чтобы затем показать какие-либо результаты обработки.
См. эти строки, где вы позже обновив TextView:
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");
поместите их в PostExecute()
После этого вы увидите текст TextView после завершения doInBackground
.
EDIT : Я заметил, что ваш слушатель onClick не проверяет, какой вид был выбран. Я считаю, что самый простой способ сделать это - с помощью операторов switch. [Править]
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings.System;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;
public class AsyncTaskActivity extends Activity implements OnClickListener {
Button btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
// because we implement OnClickListener we only have to pass "this"
// (much easier)
btn.setOnClickListener(this);
}
public void onClick(View view) {
// detect the view that was "clicked"
switch (view.getId()) {
case R.id.button1:
new LongOperation().execute("");
break;
}
}
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed"); // txt.setText(result);
// might want to change "executed" for the returned string passed
// into onPostExecute() but that is upto you
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(Void... values) {}
}
}