Android 带RESTAPI的异步任务

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

我有一个Android应用程序,它使用RESTAPI填充列表

我正在尝试使用AsyncTask获取API,但在理解它的工作原理时遇到了困难。我在后台创建API对象是为了避免NetworkOnMainThread错误,但这会导致在null对象上调用我的createItems()方法

如何在后台创建API对象,并且在OnCreate期间仍然能够使用它?谢谢

下面是我的OnCreate()方法的一部分:

下面是导致错误的方法(createItems()):

以下是异步任务:

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);
        }