Android 异步任务占用了大量的时间
我的问题是,我以前有一个程序在工作,没有线程,处理信息花费了很长时间(获取XML数据并显示它需要16秒)。现在我已经完成了整个线程和异步的工作,但是由于某种原因,它使我的程序变慢了(在模拟器中,设备现在不可用),我是否做了任何可能导致这种情况的事情,UI线程很好,但我的异步线程需要一分半钟才能执行。(当我在UI线程中使用它时,通常只需要16秒,但冻结了UI线程) 下面是我的线程的代码,它位于主类中:Android 异步任务占用了大量的时间,android,android-asynctask,Android,Android Asynctask,我的问题是,我以前有一个程序在工作,没有线程,处理信息花费了很长时间(获取XML数据并显示它需要16秒)。现在我已经完成了整个线程和异步的工作,但是由于某种原因,它使我的程序变慢了(在模拟器中,设备现在不可用),我是否做了任何可能导致这种情况的事情,UI线程很好,但我的异步线程需要一分半钟才能执行。(当我在UI线程中使用它时,通常只需要16秒,但冻结了UI线程) 下面是我的线程的代码,它位于主类中: private class TeamSearchTask extends AsyncTa
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();
}
}
}
私有类TeamSearchTask扩展了AsyncTask{
charnfo序列;
字符串[]匹配;
字符串[]数据;
字符串teamNum;
对话加载;
受保护的void onPreExecute()
{
//显示“加载”对话框
加载=新建ProgressDialog(SapphireAlliance.this);
正在加载.setMessage(“正在加载,请稍候…”);
loading.show();
}
受保护的字符串doInBackground(字符串…组号)
{
尝试
{
//团队信息------------------------------------------------------------------------------------
teamNum=teamNumber[0];
//团队数据数组
data=APIconnection.getTeams(teamNum,“”);
//显示基本团队信息
nfo=(“\n正规团队名称:\n”+数据[1]+
“\n\n位置:\n”+数据[3]+“,“+数据[4]+”,“+数据[5]+
“\n\n起始年份:\n”+数据[6]+
“\n\n机器人名称:\n”+数据[7]+
“\n\n网站:\n”+数据[8]+“\n\n\n\n\n\n\n\n\n”;
//配对档案--------------------------------------------------------------------------------------
字符串[]事件=APIconnection.getEventIdsByYear(year1);
ArrayList matches=新的ArrayList();
对于(int i=0;i可能是您的线程优先级设置得不太高。我记得默认值相当低。但是,对于您正在做的事情,它不应该超过几秒钟。我认为真正的问题在于APIconnection连接到网络并做一些需要很长时间的事情。特别是,对于执行事件获取的循环,如果每个调用打开一个新的套接字,那么将要做大量的工作,假设这是第一次匹配。:P我也有同样的问题,只做一个简单的DES解密的文件拷贝……整个过程在UI线程上运行了几秒钟,但当移动到异步任务时,它现在是需要几分钟才能完成。难以置信。
是的!这是第一次匹配!嗯。我以为异步任务有办法做到这一点,但我想没有。我认为你真正的问题是如何连接到数据源或如何解析XML。对于这种操作,主UI线程上的16秒似乎有点慢。可能吗e因为我使用的是:javax.xml.parsers.DocumentBuilderFactory;javax.xml.parsers.DocumentBuilder;org.xml.sax.SAXException;org.xml.sax.SAXParseException;而不是android.sax?您使用的API的细节通常并不重要。算法的流程更可能是问题所在。没有具体的合作伙伴关系de,我帮不了你多少忙。我建议你看看你打了多少网络电话,占用了多少内存,以及你的XML处理例程的流程。如果你的处理是真正的线性时间,那么你就没事了。但听起来你忽略了一些瓶颈。试着用它来分析你的代码。好的,我同意e检查,我的一些问题的原因是重复执行任务(出于某种原因,它执行了3次)现在加载时间缩短到30秒(仍然很多,但比以前快了很多,响应速度也快了很多)我无法让traceview工作,但我不需要它(至少现在)。