如何在选项卡之间切换时停止执行 AsyncTask,同时保留之前的内容

2023-12-01

让我解释一下我的问题.. 假设我有三个选项卡 - 片段 ab1 / 片段 ab2 / 片段 ab3。

现在我在 FragmentTab1 中有列表视图。这里我使用AsyncTask加载数据OnCreateView().

数据正在完美加载。现在,当我查看详细信息并再次返回到 FragmentTab1 中的列表视图时。这里再次加载整个数据,浪费了之前加载的数据。

现在,我需要一个解决方案,它可以一次又一次地停止执行 AsyncTask,同时保留整个视图和数据,就像我们在已弃用的 TabHost 中执行工作一样。

任何帮助或建议将不胜感激。

这是我的代码。

public class Talk extends Fragment {
   /** Define global variables over here */
   //private ProgressDialog pDialog;
StaticApiList sal;
TalkModelAll tma;
JSONObject myJasonObject = null;
private ListView lv;
private ArrayList<TalkModelAll> m_ArrayList = null;
//ArrayList<String> stringArrayList = new ArrayList<String>();
TalkArrayAdapter taa;
Set<String> uniqueValues = new HashSet<String>();
TextView rowTextView = null;

int postid;
String title;
String thumsrc;
String largeimg;
String excert;
String description;
String cat;
String myUrl;
String jsonString;
int mCurCheckPosition;
String check_state = null;
String ccc;
LinearLayout myLinearLayout;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.talk, container, false);

    new TalkAsyncTask().execute();
    /*if(check_state == null){
    new TalkAsyncTask().execute();
    }else{
        new TalkAsyncTask().execute();
        Toast.makeText(getActivity(), "Have no null value for reloading fragment", Toast.LENGTH_LONG).show();
    }*/


    LinearLayout ll = (LinearLayout) rootView.findViewById(R.id.talk_ll);
    ll.setBackgroundColor(getActivity().getResources().getColor(R.color.talk_red_bottom));

    Log.d("track", "=================> " +uniqueValues.size());
    myLinearLayout = (LinearLayout) rootView.findViewById(R.id.talk_ll_uni);

    return rootView;
}

  private class TalkAsyncTask extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();

        /*pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Please wait ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();*/
    }

    @Override
    protected String doInBackground(String... params) {
        sal = new StaticApiList();
        myUrl = StaticApiList.talk_api;
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(myUrl);

        try {
            HttpResponse httpResponse = httpClient.execute(httpGet);
            System.out.println("httpResponse");

            InputStream inputStream = httpResponse.getEntity().getContent();
            InputStreamReader inputStreamReader = new InputStreamReader(
                    inputStream);
            BufferedReader bufferedReader = new BufferedReader(
                    inputStreamReader);
            StringBuilder stringBuilder = new StringBuilder();
            String bufferedStrChunk = null;
            while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
                stringBuilder.append(bufferedStrChunk);
            }
            jsonString = stringBuilder.toString();
            Log.i("talk_all_json", jsonString);
            return stringBuilder.toString();

        } catch (ClientProtocolException cpe) {
            System.out.println("Exception generates caz of httpResponse :"
                    + cpe);
            cpe.printStackTrace();
        } catch (IOException ioe) {
            System.out
                    .println("Second exception generates caz of httpResponse :"
                            + ioe);
            ioe.printStackTrace();
        }

        return null;
    }

    @SuppressLint("DefaultLocale")
    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        check_state = jsonString;
        try{
            m_ArrayList = new ArrayList<TalkModelAll>(); 
            if (jsonString.length() > 0) {
                   JSONArray jArray = new JSONArray(jsonString);

                        for(int i=0; i < jArray.length(); i++) {

                            JSONObject jObject = jArray.getJSONObject(i);

                            title = jObject.getString("title");
                            thumsrc = jObject.getString("thumsrc");
                            largeimg = jObject.getString("largeimg");
                            excert = jObject.getString("excert");
                            description = jObject.getString("description");
                            cat = jObject.getString("cat");
                            postid = jObject.getInt("postid");
                            /////////// stringArrayList.add(jObject.getString("cat"));


                            uniqueValues.add(jObject.getString("cat"));   // Set unique elements in string array list
                             int a = 0;
                                if(a == 0){
                                    uniqueValues.add("All,");
                                     a = 1;
                                }
                            ccc = uniqueValues.toString();
                            Log.d("unique","========================> " + ccc);

                            Log.d("talklog", "Title -> " + title + " , thumsrc -> " + thumsrc + " , largeimg -> " + largeimg 
                                    + " , excert -> " + excert + " , description -> " + description + " , cat -> " + cat + " , " + "PostId " + postid );
                            Log.d("talklog", "============================= end of " + i + " ===============================");

                            tma = new TalkModelAll();
                            tma.title = title;
                            tma.thumsrc = thumsrc;
                            tma.largeimg = largeimg;
                            tma.excert = excert;
                            tma.description = description;
                            tma.cat = cat;
                            tma.postid = postid;

                            m_ArrayList.add(tma);

                        } 

                        String[] split_unique = ccc.split(",");

                        Arrays.sort(split_unique);

                        for(int i = 0; i < split_unique.length; i++){
                            Log.d("split_unique", "====>><< " + split_unique.length);
                            Log.d("split_unique", "====>><< " + ccc.split(",")[i]);
                        }

                      //  When we need dynamic number of text view's ..
                     final int N = split_unique.length; // total number of textviews to add

                    final TextView[] myTextViews = new TextView[N]; // create an empty array;

                    for (int i = 0; i < N; i++) {
                       // create a new textview
                       rowTextView = new TextView(getActivity());

                       // set some properties of rowTextView or something talk_ll_uni
                       rowTextView.setText((split_unique[i].replaceAll("[|?*<\":>+\\[\\]/']", "") + "   ").toUpperCase());
                       rowTextView.setTextColor(getActivity().getResources().getColor(R.color.talk_red_bottom));
                       rowTextView.setTextSize(25);
                       rowTextView.setId(i);
                       // add the textview to the linearlayout
                       myLinearLayout.addView(rowTextView);



                       // saving a reference to the textview for later
                       myTextViews[i] = rowTextView;
                   }


                      //if you want your array
                     /////  String [] stringArray = stringArrayList.toArray(new String[stringArrayList.size()]);


            }

            taa = new TalkArrayAdapter(getActivity(), m_ArrayList);
            lv = (ListView) getActivity().findViewById(R.id.talk_list);
            lv.setVisibility(View.VISIBLE); 
            lv.setAdapter(taa);

            lv.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub

                    TalkDetail fragment = new TalkDetail();
                    Bundle bundle = new Bundle();

                    bundle.putString("title", m_ArrayList.get(arg2).title);
                    bundle.putString("largeimg", m_ArrayList.get(arg2).largeimg);
                    bundle.putString("excert", m_ArrayList.get(arg2).excert);
                    bundle.putString("description", m_ArrayList.get(arg2).description);
                    bundle.putString("cat", m_ArrayList.get(arg2).cat);
                    //bundle.putInt("postid", m_ArrayList.get(arg2).postid);

                    fragment.setArguments(bundle);
                    ((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);

                }
            });

        }catch(Exception e){
            e.printStackTrace();
        }

        //pDialog.dismiss();

    }

}

}

我用谷歌搜索了很多,但无法得到确切的观点。我还在 StackOverFlow 上使用其他建议的内容时检查了不同的方法。

预先感谢您的合作。


为此..首先每当你回到fragment你必须再次检查是否Asynchtask是否已经执行..这意味着检查加载的数据..如果数据为空,则您已加载数据,否则您无需调用Asynchtask再次..

在您的片段中维护一个布尔标志..在 onPostExecute 将其设置为 true..每当您将一个选项卡移动到另一个片段时,将被删除并再次添加,因此在您的 onCreateView 方法中,如果布尔标志为 false 则执行异步任务..ohterwise 数据已经是已加载..

或维持一个singleton类并再次设置加载的数据,返回活动从单例类获取数据,如果数据为空,则加载加载它并设置为单例类。

In your onDestroy()的方法fragment停止AsynchTask像这样..

@Override
public void onDestroy() {
    super.onDestroy();
    if (applicationLoadTask != null) {
        if (!applicationLoadTask.isCancelled()) {
            applicationLoadTask.cancel(true);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在选项卡之间切换时停止执行 AsyncTask,同时保留之前的内容 的相关文章

随机推荐

  • SQL Presto:不支持相关子查询

    考虑表x id val 1 100 3 300 和表y id 1 2 3 对于每一行y我想要val from x哪里的id从 y 等于或最接近之前id from x像那样 id val 1 100 2 100 3 300 我试图找到与相关子
  • R 中的自举相关

    我正在尝试在 R 中进行引导相关性 我有两个变量 Var1 和 Var2 我想获得 Pearson 相关性的自举 p value my variables look like this x y 1 6080522 1 707642 2 1
  • SQL Group By 和 Order By

    我有一个标签表 想从列表中获取计数最高的标签 示例数据如下所示 id 1 tag night id 2 tag awesome id 3 tag night using SELECT COUNT Tag from images tags G
  • 基于条件的最大值

    我在 Excel 中有一个模拟数据集 我想打印最近的日期 但我希望它是最新的日期 以便类型为 引用 Type Date referral 1 6 2017 classroom 1 7 2017 referral 1 8 2017 class
  • Mac 上的 jshint 和 sublimelinter 设置配置

    我正在尝试在我的 Mac 上配置 sublimelinter 特别是 jshint 在我的 Windows 版本的 SublimeText 上有以下部分SublimeLinter sublime settings jshint option
  • Terraform:通知 SNS 的 CloudWatch 事件

    我正在学习 TF 并尝试应用一个基础设施来创建 一个简单的 lambda 函数 SNS 话题 获取 lambda 来订阅 SNS 主题 以一定时间间隔向主题发布消息的 Cloud Watch Event Cloud Watch Log Gr
  • XDocument.Validate 始终成功

    我有一个架构文件 它没有定义任何目标命名空间 即它的定义如下所示
  • Hive 上的 Spark SQL 查询执行

    我是 Spark SQL 新手 但了解 Hive 查询执行框架 我想了解spark如何执行sql查询 技术说明 如果我按照命令开火 val sqlContext new org apache spark sql hive HiveConte
  • 如何使 setInterval 在一段时间或多次操作后停止?

    我用 jQuery 创建了一个 改变单词 的循环 通过使用此答案中的代码 jQuery 查找单词并每隔几秒更改一次 一段时间后如何停止 是说 60 秒后还是循环结束后 function List your words here var wo
  • 格式化 pandas 中的数字

    对于 pandas DataFrame df min max mean a 0 0 2 300000e 04 6 450098e 02 b 0 0 1 370000e 05 1 651754e 03 c 218 0 1 221550e 10
  • 如何使用 P/Invoke 在 C# 中返回列表?

    我正在开发一个小项目 我使用 P Invoke 并希望在 C 中返回以下内容 public class std list
  • 下面的格式说明符在做什么?

    else printf 3hho data 我无法在网上或通过阅读 C 编程语言书籍找到有关如何破译它的信息 我在下面的代码片段中看到了它 该代码尝试在 telnet 协议中执行密码嗅探 if pktlen sizeof struct ip
  • 使用 hibernate 从数据库获取下一个序列值

    我有一个实体 该实体具有必须从序列设置的非 ID 字段 目前 我获取序列的第一个值 将其存储在客户端 然后根据该值进行计算 然而 我正在寻找一种 更好 的方法来做到这一点 我已经实现了一种获取下一个序列值的方法 public Long ge
  • 通过 Dexterity 在字段集之间移动字段

    在 Archetypes 中 为了将字段从字段集 或模式 移动到另一个字段集 或模式 我们可以执行以下操作 schema creators schemata default 然而 我并没有使用敏捷来实现同样的目标 我尝试过使用表单提示 前任
  • 如何使用 Microsoft Graphs 访问共享邮箱

    是否可以使用图表访问共享邮箱 我想使用图表访问共享邮箱邮件文件夹 只需将其视为任何其他用户即可 https graph microsoft com v1 0 users 电子邮件受保护 消息 确保您设置了正确的权限 Mail Read Sh
  • Django:将值从模板传递到视图

    我遇到过这种情况 单击 html 提交按钮 我调用views stream response哪个 激活 views stream response generator哪个 激活 流 py并返回一个流式Http响应我每秒都会看到一个渐进的数字
  • 如何从 xamarin.forms 中的应用程序打开设置?

    我正在研究 xamarin forms 仅在android中面临以下问题 当我的应用程序启动时 它会检查我的 GPS 位置是否打开或关闭 要检查 GPS 位置的开启或关闭 我正在使用依赖服务 public static bool Check
  • 合并 R 中的唯一值

    这是示例数据 set seed 123 data1 lt data frame id1 rep 1 5 each 2 nam1 rnorm 5 1 data2 lt data frame id2 rep 3 12 each 2 nam2 r
  • 您最喜欢的使用 Bash 的命令行技巧是什么? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前
  • 如何在选项卡之间切换时停止执行 AsyncTask,同时保留之前的内容

    让我解释一下我的问题 假设我有三个选项卡 片段 ab1 片段 ab2 片段 ab3 现在我在 FragmentTab1 中有列表视图 这里我使用AsyncTask加载数据OnCreateView 数据正在完美加载 现在 当我查看详细信息并再