Android 带RESTAPI的异步任务
我有一个Android应用程序,它使用RESTAPI填充列表 我正在尝试使用AsyncTask获取API,但在理解它的工作原理时遇到了困难。我在后台创建API对象是为了避免NetworkOnMainThread错误,但这会导致在null对象上调用我的createItems()方法 如何在后台创建API对象,并且在OnCreate期间仍然能够使用它?谢谢 下面是我的OnCreate()方法的一部分: 下面是导致错误的方法(createItems()): 以下是异步任务:Android 带RESTAPI的异步任务,android,rest,android-activity,android-asynctask,networkonmainthread,Android,Rest,Android Activity,Android Asynctask,Networkonmainthread,我有一个Android应用程序,它使用RESTAPI填充列表 我正在尝试使用AsyncTask获取API,但在理解它的工作原理时遇到了困难。我在后台创建API对象是为了避免NetworkOnMainThread错误,但这会导致在null对象上调用我的createItems()方法 如何在后台创建API对象,并且在OnCreate期间仍然能够使用它?谢谢 下面是我的OnCreate()方法的一部分: 下面是导致错误的方法(createItems()): 以下是异步任务: private class
private class GetAPITask extends AsyncTask<String, Integer, String> {
protected void onPreExecute() {
super.onPreExecute();
}
protected String doInBackground(String... params) {
api = new API(getString(R.string.dev_id), getString(R.string.auth_key));
return "API Created";
}
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
私有类GetAPITask扩展了异步任务{
受保护的void onPreExecute(){
super.onPreExecute();
}
受保护的字符串doInBackground(字符串…参数){
api=newapi(getString(R.string.dev_id)、getString(R.string.auth_key));
返回“API已创建”;
}
受保护的void onProgressUpdate(整型…值){
super.onProgressUpdate(值);
}
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
}
}
使用异步任务的目的是在后台获取数据,一旦获得数据,就用它填充视图。只有在数据准备好使用后,才能运行方法来填充视图,这些数据应该在onPostExecute
中处理。你应该这样做:
protected void onPostExecute(String result) {
super.onPostExecute(result);
createItems();
}
ASyncTask引用了外部类 将签名更改为
private static class GetAPITask extends AsyncTask<String, Integer, String> {
然后像这样使用它:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawer);
//createLists();
//populateNameLists();
API api = new API(getString(R.string.dev_id), getString(R.string.auth_key));
new GetAPITask(api, new GetAPITask.Callback() {
@Override
public void onSuccess(String result) {
Log.d("TUT", "My asynctask returned: " + result);
}
}).execute();
//createItems();
(...)
}
正如您所看到的,现在它已被清理,您的ASyncTask除了返回doInBackground()
方法中的字符串外,什么也不做。您需要将要执行的代码移到这里!
(即将createItems
移动到doInBackground()内部
比如:
protected String doInBackground(String... params) {
String testString = api.testSession();
String itemString = api.getItems(...);
(...)
return testString;
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
callback.onComplete(result);
}
如果要从ASyncTask返回多个字符串,则必须创建一个数据类并返回该数据类
private static class GetAPITask extends AsyncTask<String, Integer, String> {
interface Callback {
void onComplete(String text);
}
private final API api;
private final Callback callback;
GetAPITask(API api, Callback callback) {
this.api = api;
this.callback = callback;
}
protected String doInBackground(String... params) {
return "API Created";
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
callback.onComplete(result);
}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawer);
//createLists();
//populateNameLists();
API api = new API(getString(R.string.dev_id), getString(R.string.auth_key));
new GetAPITask(api, new GetAPITask.Callback() {
@Override
public void onSuccess(String result) {
Log.d("TUT", "My asynctask returned: " + result);
}
}).execute();
//createItems();
(...)
}
protected String doInBackground(String... params) {
String testString = api.testSession();
String itemString = api.getItems(...);
(...)
return testString;
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
callback.onComplete(result);
}