Java 异步任务/处理程序界面
所以我有一个AsyncTask,它从一个网站获取数据,并在它的post execute上调用一个main函数来为main的textview设置文本 这是代码Java 异步任务/处理程序界面,java,android,android-asynctask,Java,Android,Android Asynctask,所以我有一个AsyncTask,它从一个网站获取数据,并在它的post execute上调用一个main函数来为main的textview设置文本 这是代码 @Override protected Void doInBackground(String... arg0) { result = connect(start);//connect to the webpage, start is a URL // TODO Auto-generated method stub
@Override
protected Void doInBackground(String... arg0) {
result = connect(start);//connect to the webpage, start is a URL
// TODO Auto-generated method stub
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Document doc = Jsoup.parse(this.result);
Elements stuff = doc.select("td");
MainActivity.GetData(doc);//set the textview
}
我每五秒钟调用一个处理程序来执行此操作,下面是处理程序代码
hand = new Handler();
r = new Runnable() {
@Override
public void run() {
dh = new DownloadHelper("http://app2.nea.gov.sg/anti-pollution-radiation-protection/air-pollution/psi/psi-readings-over-the-last-24-hours");
dh.execute("");// TODO Auto-generated method stub
hand.postDelayed(this, 10000);
}
};
hand.post(r);
发生的事情是,当网站加载时,我的UI延迟了很多,几乎到了冻结点。我不知道是什么原因造成的,我的UI是基于一个带有片段的ViewPager
不过,我不是从片段中运行这段代码,而是从我的主要活动的onCreate中运行
编辑:我将onPostExecute编辑成这样
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Elements stuff = doc.select("td");
String[] arr = new String[stuff.size()];
for(int i = 0 ; i < 3 ; i ++)
{
arr[i] = stuff.get(79 + i).text();
}
MainActivity.GetData(arr);
MainActivity.dismissLoading();
}
这是connect()
对于那些真正偶然发现我的问题并希望得到答案的人,我在另一个项目中设法解决了它 基本上,在
while ((result = br.readLine()) != null)
{
result2 += result;
}
循环,而不是直接将结果追加到result2,而是将结果追加到StringBuffer。然后在循环结束时,将StringBuffer添加回result2。您是否尝试在
doInBackground
内部执行Jsoup.parse(this.result)
?文件的解析和读取也应该在非ui线程中完成。尝试将对parse()的调用移动到doInBackground()@SaurabhVerma中。我尝试过了,但仍然滞后。。可能是因为处理程序每10秒创建一个新的AsyncTask?(我在我的帖子中搞错了,现在不是10秒5)1)将解析调用移动到doInBackground
2)显示GetData()和connect(),如果您仍然使用与问题中相同的代码,您的解析例程在UI线程上-将其从UI线程上取下。如果数据很小,就不会有问题,因为数据越大,它将锁定UI线程,并且/或者在下一个请求到达之前需要5/10秒以上的时间。
public static String connect(String l)
{
String url = l;
HttpURLConnection connect;
String result;
String result2 = null;
BufferedReader br;
try {
connect = (HttpURLConnection) (new URL(url)).openConnection();
br = new BufferedReader(new InputStreamReader(connect.getInputStream()));
while ((result = br.readLine()) != null)
{
result2 += result;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.print("ERROR");
}
return result2;
}
while ((result = br.readLine()) != null)
{
result2 += result;
}