在一个片段中,我使用'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组件而崩溃。