如何使用从服务器获取的数据加载EditText字段

时间:2013-12-14 18:38:59

标签: android android-intent android-asynctask

我有一个Activity,在显示Text / EditText字段之前,我想调用服务器获取详细信息,然后根据从服务器返回的数据获取字段setText

以下是我正在做的事情,但字段似乎没有从服务器获取数据。我想因为我正在调用一个AsyncTask,它在后台运行,同时向用户显示字段。

问题

android如何解决这个问题?我应该使用什么样的模式?

此活动从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;
    }
}
}

2 个答案:

答案 0 :(得分: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的一个婴儿车。

所以你可以更新在ui线程上调用的onPostExecute中的ui

示例:

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

答案 1 :(得分:0)

AsyncTask有3种方法可以覆盖:

1:onPreExecute

在UI线程上执行。那么在服务调用之前,你想在UI上做什么(例如:显示进度对话框)。

2:doInBackground

在后台执行,因此执行长时间运行的任务,例如从服务器获取数据。

3:onPostExecute

执行UI线程并在doInBackground完成后调用,您可以在此处理结果并更新UI

例如:

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) {

        }
}