当前位置: 首页 > 知识库问答 >
问题:

异步任务片段背景数据

邬令
2023-03-14

我对如何从这个网站将大量模板JSON数据加载到我的应用程序中而不减慢主UI线程感到非常陌生和困惑。我可以将要从JSON响应加载的数据加载到我的recycler视图中,但单击底部显示该数据的导航选项卡需要很长时间才能加载到页面上。

我明白这是因为数据没有正确加载到后台线程,这就是我感到困惑的地方。

我希望能够从后台任务返回一个ArrayList,并将填充的ArrayList作为我的recyclerview适配器传递给我。以下是包含AsyncTask和recyclerview代码的片段:

public class LoadJSONAsyncTask extends AsyncTask<String, String, ArrayList<String>>
    {

        protected void onPreExecute()
        {


        }

        public String getJSONFromURL(String inUrl) throws IOException
        {
            URL url2 = new URL(inUrl);
            HttpURLConnection urlConnection = (HttpURLConnection) url2.openConnection();
            StringBuilder total = new StringBuilder();

            try
            {
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                BufferedReader r = new BufferedReader(new InputStreamReader(in));

                for(String line; (line = r.readLine()) != null;)
                {
                    total.append(line).append('\n');
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }

            finally
            {
                urlConnection.disconnect();
            }

            return total.toString();
        }

        @Override
        protected ArrayList<String> doInBackground(String... params)
        {
            LoadJSONAsyncTask jParser = new LoadJSONAsyncTask();
            JSONArray array = null;
            JSONObject json = null;
            String url = "https://baconipsum.com/api/?type=meat-and-filler";

            StringBuilder returnMe = new StringBuilder();
            results = new ArrayList<>();

            try {
                array = new JSONArray(jParser.getJSONFromURL(url));
                for(int n = 0; n < array.length(); n++)
                {
                    try {
                        json = new JSONObject();

                        json.put("name", jParser.getJSONFromURL(url));
                        results.add(jParser.getJSONFromURL(url));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            } catch (JSONException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }



            return results;
        }

        protected void onPostExecute()
        {

        }

    }

在我的片段中的onCreateView()方法中,recyclerview的定义如下:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        try
        {
            results = new LoadJSONAsyncTask().execute(url).get();
            for(int i = 0; i < results.size(); i++)
            {
                newsFeedList.add(new NewsFeed(results.get(i)));
            }
        } catch (ExecutionException e) {

        } catch (InterruptedException e) {e.printStackTrace();
            e.printStackTrace();
        }
        View view = inflater.inflate(R.layout.fragment_feeds, container, false);

        newsFeedList = new ArrayList<>();

        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));


        final NewsAdapter mAdapter = new NewsAdapter(getActivity(), newsFeedList);
        recyclerView.setAdapter(mAdapter);


        return view;
    }

我觉得在onCreateView()方法中,调用arraylist来执行数据的方式就是挂起线程上的数据。一个清晰的解释和例子将不胜感激!

共有2个答案

樊胜
2023-03-14

在LoadJSONAsync任务结束后调用片段

戚翰飞
2023-03-14

覆盖LoadJSONAsyncTaskonPostExecute,并将所有UI更新放在那里。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.fragment_feeds, container, false);

        newsFeedList = new ArrayList<>();

        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        final NewsAdapter mAdapter = new NewsAdapter(getActivity(), newsFeedList);
        recyclerView.setAdapter(mAdapter);

        LoadJSONAsyncTask asyncTask = new LoadJSONAsyncTask() {
        @Override
        void onPostExecute(ArrayList<String> results) {
                // update your adapter here with the result

                for(int i = 0; i < results.size(); i++)
                {
                    newsFeedList.add(new NewsFeed(results.get(i)));
                }

                // notify adapter here to update the view
                mAdapter.notifyDataSetChanged()
            }
        }

        asyncTask.execute(url);

        return view;
    }

。get()挂起主线程。

下面是如何正确使用异步任务。https://developer.android.com/reference/android/os/AsyncTask

 类似资料:
  • 一个小背景:我的主要活动时,“在简历上”连接到我的服务器要求信息。这是正确的。当活动接收到答案时,它将数据加载到数组上,在加载完数组后,它调用位于主活动上的“updateFragments”。在这儿... DataManager类是:构造函数: 异步任务调用以下命令:

  • 问题内容: 我为设置背景图片有一个小问题。 这是我在网站上获得的html: 这是CSS: 我不知道为什么按钮的背景仍然是白色。 问题答案: 令人惊讶的是,这里没有答案解决或提及实际问题。 该CSS选择器说:“给我一个元素与ID 里面 一个元素”,就像这样: 但是,您想要的是 带有* id 的元素。而选择器将是(请注意 button 和 #rock 之间缺少的空间)。 * 正如@Greg已经提到的:

  • 我正在使用jetpack导航从片段过渡到细节片段。 我需要帮助在显示细节片段的片段上显示细节片段。 请看下面的照片,看看我正在努力实现什么: 我也在导航图中的动画上使用基本的fade_in/fade_out。 这是我得到的结果: 如何设置转换以使细节片段显示在呈现视图上? 这是我所有的进步: 底部导航菜单 导航图 主要活动。kt Tab1片段(这是带有埃菲尔铁塔图像的片段 赏金编辑: 我希望在导航

  • 主要内容:本节引言:,1.相关概念,2.AsyncTask全解析:,3.AsyncTask使用示例:,本节小结:本节引言: 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的东西吧! 1.相关概念 1)什么是多线程: 答:先要了解这几个名称:应用程序,进程,线程,

  • 问题内容: 如果选择了该面板(单击该面板),则该面板的颜色为蓝色。另外,我在该面板上添加了一个小标志(图像),它表示所选面板之前已被选中。 因此,如果用户看到例如10个面板,其中有4个带有这个小标记,则他知道自己之前已经单击了这些面板。到目前为止,这项工作还不错。现在的问题是我无法显示小标志并使面板同时变为蓝色。 我使用css将面板设置为蓝色,使用设置背景图像。但是背景色似乎在图像上方,因此您看不

  • 问题内容: 我对JavaFX中的/ 概念非常困惑。 我在后台工作中使用了基于后台线程的模型,该模型要求对UI进行任何更新。 假设我对进度栏等不感兴趣。我正在对模型进行一些实际工作,这些工作必须在GUI的视图中进行更新(例如,根据后台的某些连接随时间更新的参与者列表,基于某些用户输入的参与者列表,按年龄分类)和起源)。这是我通常在启动并使用的后台线程中实现的。 现在,在JavaFX 2中,它们使用s