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调用片段方法

如何在切换片段时停止 AsyncTask?

自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?

重工作的Asynctask替代方案(在UI中添加大量片段)

ViewPager的两个片段并行运行

恢复片段而不重新创建?