2013-07-25 32 views
0

所以我有这个从网站获取数据的AsyncTask,并且在它的post之后执行它调用一个main函数来为main的textview设置setText。AsyncTask/Handler lagging UI

这是代码。

@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 
} 

我每5秒调用一次处理程序来执行此操作,这里是处理程序代码。

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滞后很多,几乎到了冻结的地步。我不知道是什么导致了这一点,我的用户界面基于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(); 
} 

这是我的GetData

public static void GetData(String[] s) 
{ 

edit.setText(s[0]); 




} 

这是连接()

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; 

} 
+0

你有没有尝试在'doInBackground'内执行'Jsoup.parse(this.result)'? – Desert

+0

解析和读取文件也应在非ui线程中完成。尝试将调用移动到解析()内doInBackground() –

+0

@SaurabhVerma我试过了,它仍然滞后..可能是因为处理程序每​​10秒创建一个新的AsyncTask? (我在我的文章中弄错了,它是10秒而不是5) – user2519193

回答

1

对于任何人究竟是谁偶然发现我的问题,并希望得到答案,我设法修复它在另一个项目上工作。

基本上,在

while ((result = br.readLine()) != null) 
    { 
     result2 += result; 
    } 

环,而不是附加结果直接RESULT2,追加结果一个StringBuffer。然后在循环结束时,将StringBuffer加回到result2。