Ted Hopp ответит то, что вы ищете. Я добавляю этот ответ, чтобы опубликовать код. Как и предполагал Тед, ваша активность должна просто заниматься своим делом, пока AsyncTask
делает свое дело.
Когда ConHelper
выполнено, он может получить доступ к Activity через onPostExecute
, который запускает в главном потоке .
Вы, конечно, не хотите вызывать get
on из onCreate
, потому что цикл while
в get
просто вызовет блокировку основного потока, уничтожив всю причину создания ConHelper
во-первых.
Ключ в том, что вы хотите структурировать Activity
так, чтобы он мог работать без доступа к каким-либо данным, полученным в ConHelper
. Если вы не можете продолжить работу без переменной data
из вашего примера onCreate
, то перенос работы из основного потока вам не поможет.
Итак, давайте предположим, что вы хотите выполнить длительный вызов, который возвращает String
, который вы хотели бы отобразить в TextView
. Вот один из способов сделать это:
public class MyActivity extends Activity {
protected TextView myTextView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // or whatever layout you have
myTextView = (TextView)findViewById(R.id.mytextview); //or whatever widgets/ids you use
ConHelper ch = new ConHelper();
ch.execute();
}
class ConHelper extends AsyncTask<..., Void, String>{
protected String doInBackground(..) {
// connect and get data.
return <some lengthy method call that returns a String>;
}
protected void onPostExecute(String resultFromDoInBackground) {
myTextView.setText(resultFromDoInBackground);
}
}
}