Android片段+;异步任务

Android片段+;异步任务,android,android-fragments,android-asynctask,Android,Android Fragments,Android Asynctask,在一个片段中,我使用“AsyncTask”从URL检索数据。我的代码的主要目的是访问数据(通过AsyncTask)并将“JSONArray”传递给片段。 问题是,在片段方面,当我检查应该有结果的变量时,我得到一个错误,该变量为null 代码如下: public class MyFragment extends ListFragment { //this is the variable that should have the result from the AsyncTa

在一个片段中,我使用“AsyncTask”从URL检索数据。我的代码的主要目的是访问数据(通过AsyncTask)并将“JSONArray”传递给片段。 问题是,在片段方面,当我检查应该有结果的变量时,我得到一个错误,该变量为null

代码如下:

    public class MyFragment extends ListFragment {
        //this is the variable that should have the result from the AsyncTask
        JSONArray myResult = null;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            (...)
            //execute the asyncTask
            new GetResult().execute(email, password);
            (...)
        }

        //The AsyncTask
        private class GetResult extends AsyncTask<String, Void, JSONArray> {
            @Override
            protected JSONArray doInBackground(String... params) {

                (...)

                JSONArray jsonArray = (JSONArray) json.get("customer");
                return jsonArray;
            }

            protected void onPostExecute(JSONArray result){
                (...)
                //this is where I try to pass the data to the fragment
                MyFragment.this.myResult = result;
            }

        }


    }
公共类MyFragment扩展了ListFragment{
//这是应具有AsyncTask结果的变量
JSONArray myResult=null;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
(...)
//执行异步任务
新建GetResult().execute(电子邮件、密码);
(...)
}
//异步任务
私有类GetResult扩展了异步任务{
@凌驾
受保护的JSONArray doInBackground(字符串…参数){
(...)
JSONArray JSONArray=(JSONArray)json.get(“客户”);
返回jsonArray;
}
受保护的void onPostExecute(JSONArray结果){
(...)
//这就是我试图将数据传递给片段的地方
MyFragment.this.myResult=结果;
}
}
}

有人能帮我吗?提前感谢。

是否使用执行后的值方法。您应该知道,在调用execute之后,主线程上的代码仍在运行,只有在postExecute完成之后,您才能获得该值

尝试使用此代码,并确保您的jsonstring不为null,因为您不会发布完整的代码,而且我看不到myResult变量是否已更改:

try {
                        JSONArray json = new JSONArray(jsonstring);

                        JSONObject json_customer = json.getJSONObject("customer");

                        return json_customer;
                        } catch (JSONException e) {
                        return null
                    }

对我来说,从字符串数据到json的反序列化似乎有问题。我们缺少您正在解析的确切数据的信息。考虑使用这个更先进的JSON处理库Liga GSON或杰克逊。通常使用它们会更容易。

听起来好像在
AsyncTask
完成检索之前,您正在尝试读取
myResult
变量。为确保正确填充,请将其放入
onPostExecute
函数中,在这一行
MyFragment.this.myResult=result之后

Log.i(“我的结果值是:”,MyFragment.this.myResult.toString())

如果您正确检索它,它应该在LogCat中打印出来,之后您应该能够访问该变量


在单独的注释中,考虑使用或其他网络插件使您的生活更容易。

< P>也许您可以使用清晰的方式将数据从任务转移到片段。

1) 将接口定义为要在AsyncTask中调用的事件侦听器,如

    public interface TaskEventListener(){

        public void onTaskStarted(int messageId);

        public void onTaskStopped(int messageId, int resultCode);

        public void onDataReady(Object parameter);    
    }
2) 让片段实现这个EventListener,将处理代码放入onDataReady()函数中

3) 将片段实例作为EventListener实例传递

4) 在从AsyncTask扩展的类中,在
onPreExecute()
函数中调用
onTaskStarted()
,在
onPostExecute()
函数中调用
onDataReady()
onTaskStopped()
并仅在
onCancelled()
函数中调用
onTaskStopped()


5) 请使用后台任务类中的弱引用,以防止引用无效UI组件时崩溃

在onPostexecute()中看到“结果”中的值了吗?当您使用内部类时,您可以在AsyncTask中直接访问myResult。您应该接受对您帮助最大的答案。我在“onPostExecute”中放置了一条Toast消息,只是为了检查“myResult”是否返回了除“null”以外的任何值,结果是我得到了我想要的值(不是“null”)。但正如您所说,我正在尝试在AsyncTask完成之前读取变量……如果是这样,我该如何解决这个问题?我的意思是,在AsyncTask完成后如何获取值?惯例是在启动请求时显示加载指示器,并在调用“onPostRequest”后使用返回的数据更新UI,然后隐藏加载指示器。这里有一种显示加载指示器的方法:在我的“onPreExecute”方法中,我已经使用了这个加载指示器,在我的“onPostExecute”方法中,我将其忽略,但仍然…相同的错误…它告诉我,我的JsonArray为null(myResult),您只能在onPostExecute函数运行后从UI线程访问该变量。在此之前不要使用该变量-在onPostExecute执行后对该变量中的数据执行任何需要执行的操作。显示加载指示器只是为了让用户知道您的应用程序正在后台执行某些操作。这里有一篇很好的文章可以帮助您更好地理解AsyncTasks:我在“onPostExecute”中放了一条Toast消息,只是为了检查“myResult”是否返回了除“null”以外的任何值,结果我得到了我想要的值(不是“null”)。但正如您所说,我正在尝试在AsyncTask完成之前读取变量……如果是这样,我该如何解决这个问题?我的意思是,在AsyncTask完成后如何获取值?不管您想对该变量执行什么操作,都可以在postExecute方法中执行,或者在其完成时生成另一个操作。