Android Fragment + AsyncTask



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

代码如下:

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

    }
有人能帮我一下吗?

您是否使用后值postExecute方法?你应该知道在调用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处理库,如Gson或Jackson。

听起来像是在AsyncTask完成检索之前试图从myResult变量读取它。为了确保正确填充,将其放入onPostExecute函数中,在MyFragment.this.myResult = result;:

行之后

Log.i("my result value is: ", MyFragment.this.myResult.toString())

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

另一个注意事项,考虑使用Volley或Retrofit或其他网络插件,使您的生活更轻松。

也许您可以使用一种清晰的方式将数据从任务传输回片段。

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组件而崩溃。

相关内容

  • 没有找到相关文章

最新更新