我有一个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;
}
}
}
答案 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) {
}
}