【问题标题】:Asynctask taking ridiculous amount of timeAsynctask 花费了可笑的时间
【发布时间】:2010-10-12 03:06:55
【问题描述】:

我的问题是我之前有一个程序工作,没有线程,处理信息需要很长时间(16 秒才能获取 XML 数据并显示它)。现在我已经完成了整个线程和异步操作,但是由于某种原因,它使我的程序变慢了(在模拟器中,设备现在不可用),我所做的任何事情都可能导致这种情况, UI 线程很好,但我的异步线程需要一分半钟才能执行。 (当我在 UI 线程中使用它时只需要 16 秒,但冻结了 UI 线程)

这是我的线程的代码,它位于主类中:

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

    CharSequence nfo;
    String [] matches;
    String [] data;
    String teamNum;
    ProgressDialog loading;

    protected void onPreExecute()
    {
        //Show the 'loading' dialog
        loading = new ProgressDialog(SapphireAlliance.this);
        loading.setMessage("Loading, please wait...");
        loading.show();
    }

    protected String doInBackground(String... teamNumber) 
    {
        try
        {
            //Team information ------------------------------------------------------------------------------------
            teamNum = teamNumber[0];        
            //Array of team data
            data = APIconnection.getTeams(teamNum, "");

            //Display basic team info
            nfo = ("\nFormal Team Name:\n" + data[1] + 
                    "\n\nLocation:\n" + data [3] + ", " + data[4] + ", " + data[5] +
                    "\n\nRookie Year:\n" + data[6] +
                    "\n\nRobot Name:\n" + data[7] +
                    "\n\nWebsite:\n" + data[8] + "\n\n\n\n\n\n\n\n\n"); 

            //Make match archive --------------------------------------------------------------------------------------

            String [] events = APIconnection.getEventIdsByYear(year1);
            ArrayList<String> matches = new ArrayList<String>();
            for (int i = 0; i<events.length; i++)
            {
                String [] add = APIconnection.getMatches2(teamNum, events[i] ,"","");
                for(int j = 0; j<add.length; j++)
                    matches.add(add[j]);            
            }
            String [] out = new String [matches.size()];
            matches.toArray(out);
            return "";
        }
        catch(Exception e)
        {
            return e.toString();
        }
    }

    protected void onPostExecute(String result) {
        if(result.equals(""))
        {
            info.setText(nfo);
            matchArchive(matches);

            //title 
            CharSequence ttl = "Team " + teamNum;
            titlets.setText(ttl.toString());
            loading.dismiss();
        }
        else 
        {
            alert.setMessage(result);
            alert.show();
        }
    }
}

里面有什么可能导致这种情况的吗? :|

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    您的线程优先级可能设置得不是很高。我记得默认值相当低。但是,对于您正在做的事情,它不应该花费超过几秒钟的时间。我认为真正的问题在于 APIconnection 进入网络并做一些需要很长时间的事情。特别是,如果每个调用都打开一个新套接字,那么执行事件获取的 for 循环将做很多工作,假设这是第一个匹配项。 :P

    【讨论】:

    • 是的!这是第一次比赛!
    • 嗯。我认为有一种方法可以为 AsyncTask 做到这一点,但我想不是。我认为您真正的问题是如何连接到数据源或如何解析 XML。对于这种操作,主 UI 线程上的 16 秒似乎有点慢。
    • 可能是因为我使用的是:javax.xml.parsers.DocumentBuilderFactory; javax.xml.parsers.DocumentBuilder; org.xml.sax.SAXException; org.xml.sax.SAXParseException;那些而不是 android.sax?
    • 您通常使用的 API 的细节并不重要。算法的流程更可能是问题所在。如果没有特定的代码,我无法为您提供更多帮助。我建议您查看您进行了多少网络调用、使用了多少内存以及您的 XML 处理例程的流程。如果你的处理是真正的线性时间,那么你很好。但听起来你忽略了一些瓶颈。尝试使用traceview 分析您的代码。
    • 好的,我已经检查过了,我的一些问题的原因是重复执行任务(由于某种原因它执行了 3 次)现在加载时间减少到30 秒(仍然很多,但比以前快了很多,而且响应速度也快了很多)我永远无法让 traceview 工作,但我不需要它(至少现在)。
    【解决方案2】:

    我遇到了同样的问题,只是用简单的 DES 解密进行文件复制......整个事情在 UI 线程上运行了几秒钟,但是当移动到 ASYNCTASK 时,它现在需要 MINUTES 才能完成.难以置信。

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2015-08-02
      • 2017-02-15
      • 2020-07-23
      • 2013-07-11
      相关资源
      最近更新 更多