在 android asynctask 中加载有时会花费很多时间

loading takes so much time sometimes in android asynctask

我正在使用 AsyncTask 调用网络服务并呈现我从网络服务获得的数据。

这工作正常,但有时进度对话框不会被关闭,也无法在日志中看到此问题的原因。

示例:: 我有一个 Web 服务,它被调用以获取带有索引的列表视图数据(对于 1,它将 return 前 5 个数据,对于 2,它将 return 第二个 5 数据,依此类推)

单击第 1 页按钮后,它 return 的数据并呈现相同的内容,当我单击第 2 页按钮时,它开始加载并且不会关闭。既不呈现数据也不关闭进度对话框。 现在我关闭了应用程序并再次重新启动,这一次情况都很好。

如有任何帮助,我们将不胜感激 提前致谢

异步任务代码:

public class getList extends AsyncTask<Void, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setCancelable(false);
        pDialog.setMessage("Please wait...");
        pDialog.setCanceledOnTouchOutside(false);
        pDialog.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        String text = null;
        JSONObject json; 
        HttpClient httpclient = new DefaultHttpClient();
        //Configuration.empcode.trim()
        HttpGet httppost = new HttpGet(ListURL+UserCode+"/"+indexNo);

        try {
            HttpResponse response = httpclient.execute(httppost);

            // for JSON:
            if (response != null) {
                InputStream is = response.getEntity().getContent();
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(is));
                // String result = EntityUtils.toString((HttpEntity)
                // response);
                StringBuilder sb = new StringBuilder();
                String line = null;
                try {
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                text = sb.toString();
            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
        return text;
    }

    @Override
    protected void onPostExecute(String result) 
    {   



        pDialog.dismiss();
        if(result!=null)
        {
            try
            {
                JSONObject resultObject = new JSONObject(result);   
                JSONArray resultArray = resultObject.getJSONArray("Table");

                for(int i =0;i<resultArray.length();i++)
                {   
                    JSONObject resultObjects = resultArray.getJSONObject(i);
                    Code = resultObjects.getString("Code");
                    Title = resultObjects.getString("Title");
                    status= resultObjects.getString("status");
                    date= resultObjects.getString("date");


                    TitleList.add(Title);
                    CodeList.add(Code);
                    statusList.add(status);
                    dateList.add(date);

                    int count = db.getInProgressCount(CourseCode);  

                    if(count==0)
                    {
                        db.addInProgress(new InProgressTable(Code,Title,status,date));
                    }
                    else
                    {   
                        db.updateInProgress(new InProgressTable(Code,Title,status,date));
                    }
                }

                adapter = new CustomInProgressList(getActivity(),TitleList,CodeList,statusList,dateList);

                //adapter.setCustomButtonListner(Catalog_Activity.this);
                list.setAdapter(adapter);

                scrollMyListViewToBottom(resultArray.length());
                int count = db.getAllInProgressCount();
                if (adapter.getCount()<1 && count<1){
                    list.setVisibility(View.GONE);
                    noRes.setVisibility(View.VISIBLE);
                }else {
                    list.setVisibility(View.VISIBLE);
                    noRes.setVisibility(View.GONE);
                }

                if (resultArray.length()<5);
                loadMore.setVisibility(View.GONE);
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
        else
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
            builder.setTitle("Alert");              
            builder.setMessage("Data is not available, Please try again later"); 
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() 
            { 
              public void onClick(DialogInterface dialog, int which) 
              { 
               dialog.cancel();
              } 
            }); 

            AlertDialog dialog = builder.create(); 
            dialog.show();
        }
    }
}

我在我的应用程序中使用了多个 Asynctask。 有问题吗??

好的,这是你的问题 -

pDialog 据我了解是在 activity 中声明的。让我们看看有 2 个请求的情况。

当您启动第一个并立即启动另一个时 - 您的 pDialog 现在是新对话框(它指向另一个对话框)并且第一个存在但没有指向它,并且它没有关闭!这就是您没有关闭对话框的原因。

这将在以下情况下引起:

1) 第一个请求开始;

2) 在第一个请求结束之前开始第二个请求;

您必须在所有请求中处理一个对话框,或者在重新初始化之前关闭对话框。