2013-12-14 2 views
1

У меня есть активность, где перед показом полей Text/EditText я хочу сделать звонок на сервер, чтобы получить информацию, а затем setText из полей на основе данные возвращаются с сервера.Как загрузить поля EditText с данными, полученными с сервера

Ниже приведено то, что я делаю, но поля, похоже, не имеют данных, извлеченных с сервера. Я думаю, потому что я вызываю AsyncTask, который запускается в фоновом режиме, и в то же время поля отображаются пользователю.

Вопрос

Как андроида дело с этим? Какую модель мне следует использовать?

Эта активность вызывается из MainActivity.java так:

Intent act = new Intent(getApplicationContext(), MySecondActivity.class); 
create.putExtra("theId", "138"); 
startActivity(create); 

в MySecondActivity.java я сделать следующее:

public class MySecondActivity extends SherlockActivity { 

private EditText fieldOne; 
private EditText fieldTwo; 
private MyObj obj = new MyObj(); 
private int id; 

protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.shared_activity); 
    fieldOne = (EditText)findViewById(R.id.field_one); 
    fieldTwo = (EditText)findViewById(R.id.field_two); 

    id = Integer.parseInt(getIntent().getStringExtra("theId")); 
    new FetchDetail().execute(); 

    //If I put the below two lines inside the AsyncTask then I get an error: 
    //"Only the original thread that created a view hierarchy can touch its views." 
    fieldOne.setText(obj.getOne()); // 
    fieldTwo.setText(obj.getTwo()); // 

} 

class FetchDetail extends AsyncTask<String, String, String> { 
    @Override 
    protected String doInBackground(String... strings) { 
    final RestAdapter restAdapter = new  
    RestAdapter.Builder().setServer("http://10.0.2.2:8080").build(); 
    final MyTaskService apiManager = restAdapter.create(MyTaskService.class); 
    final MyObj obj = apiManager.getDetails(id); 
    return null; 
    } 
} 
} 

ответ

0
If I put the below two lines inside the AsyncTask then I get an error 

У них в onPostExcute

fieldOne.setText(obj.getOne()); 
fieldTwo.setText(obj.getTwo()); 

Сделайте свое фоновое вычисление в doInbackground. Результат возврата: doInbackground. Результатом вычисления doInbackground является коляска до onPostExecute.

Таким образом, вы можете обновить пользовательский интерфейс в onPostExecute, который вызывается на поток пользовательского интерфейса

Пример:

protected String doInBackground(String... params) 
{ 
// background computation 
return "hello"; // return string 
} 
@Override 
protected void onPostExecute(String result) // string 
{ 
    super.onPostExecute(result); 
    fieldOne.setText(result); // hello is set to field One 
} 

Для получения дополнительной информации читайте тему под The4Steps в документации

http://developer.android.com/reference/android/os/AsyncTask.html

0

AsyncTask имеет 3 метода для переопределения:

1: onPreExecute

Выполняется по потоку пользовательского интерфейса. Поэтому сделайте то, что вы хотите сделать в пользовательском интерфейсе перед вызовом службы здесь (Ex: показать диалог прогресса).

2: doInBackground

Запускает в фоновом режиме, чтобы выполнять длительные задачи, как извлечение данных с сервера.

3: onPostExecute

Запускает на UI потоке и вызывается один раз doInBackground завершения вы можете обработать результат здесь и обновления пользовательского интерфейса

Ex:

public class RestServiceTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 

     } 

     @Override 
     protected void onPostExecute(String result) { 

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