Asynctask结果显示重新创建片段后
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Asynctask结果显示重新创建片段后相关的知识,希望对你有一定的参考价值。
在我的应用程序中,我从用户在fragment
获取数据并使用输入的数据通过JSON
使用AsyncTask
获得结果然后将其保存到database
然后在另一个fragment
中显示。
问题是当我执行asyncTask
并打开fragment
数据不显示,除非我旋转设备(强制片段重新创建)。
我的第一个片段代码:
...
SecondFragment secondFragment = new SecondFragment();
new SecondFragment.GetTask("s").execute(URL);
FragmentTransaction ft =getActivity().getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_in_up);
ft.add(R.id.s_con, secondFragment).addToBackStack("back").commit();
...
第二个片段代码:
...
recyclerView.setAdapter(new SAdapter(getContext(),R.layout.group_header));
...
public static class GetTask extends AsyncTask<String, String, Void> {
String arrayname;
GetTask(String arrayname) {
this.arrayname = arrayname;
}
}
@Override
protected Void doInBackground(String... params) {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL(params[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
String finalJson = buffer.toString();
JSONObject parentObject = new JSONObject(finalJson);
JSONObject secondParentObject = parentObject.getJSONObject("data");
//json getter and adder to database
JSONArray Array = secondParentObject.getJSONArray(arrayname);
for (int i = 0; i < Array.length(); i++) {
JSONObject finalObject = Array.getJSONObject(i);
switch (arrayname) {
case "s":
db.SAddJson(finalObject);
break;
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}
AsyncTask在另一个线程中执行。第二个片段未更新,因为asynctask在您加载时仍在执行。当你改变方向时,它简单地重新创建了第二个片段,然后Asynctask完成了它的任务,这就是它更新的原因。将AsyncTask移动到第一个片段并在Async任务的onPostExecute()中加载第二个片段。 onPostExecuted()在UI线程中运行。
在片段中使用AsyncTask时,可能会出现方向更改等场景,其中活动将被重新创建,这也会导致您的片段被重新创建,并且将再次调用AsyncTask。这也可能导致内存泄漏。为了避免这种情况,请调用第一个Fragment的onCreate()中的方法;
setRetainInstance(true);
这不会在方向改变时杀死片段,它会更安全。要了解有关处理方向更改的更多信息,请查看此链接:
https://developer.android.com/guide/topics/resources/runtime-changes.html
以上是关于Asynctask结果显示重新创建片段后的主要内容,如果未能解决你的问题,请参考以下文章
从Asynctask ONPostExecute调用片段方法