【问题标题】:loading takes so much time sometimes in android asynctask在android asynctask中加载有时需要很长时间
【发布时间】:2016-06-07 07:19:33
【问题描述】:

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

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

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

一旦我单击第 1 页按钮,它就会返回数据并呈现相同的数据,当我单击第 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。 这是个问题吗??

【问题讨论】:

  • 请出示您的代码)
  • 请发布您的代码
  • @StepanMaksymov 查看我更新的帖子
  • @Jack 看我更新的帖子
  • 可能是您的服务调用两次打印登录 onPreExecute() 是否打印两次。

标签: android performance android-asynctask progressdialog


【解决方案1】:

好的,这是你的问题 -

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

当你开始第一个,然后立即开始另一个 - 你的pDialog 现在是新对话框(它指向另一个对话框)并且第一个存在而不指向它,它没有关闭!这就是你没有关闭对话框的原因。

这将在以下情况下引起:

1) 第一个请求开始;

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

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

【讨论】:

  • 我会尝试的,但解决方案似乎很合乎逻辑。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 2021-05-14
  • 2012-06-24
  • 2017-08-10
  • 1970-01-01
相关资源
最近更新 更多