2011-04-11 281 views
1

我有一個應用程序獲取特定日期的數據作爲來自Web服務器的響應,並根據已經到達的數據(數字/時間)繪製o/p圖。android異步任務

現在我正在調用網絡服務器作爲異步任務。

我也可以在多個屏幕上(前一天/第二天)多次調用Web服務器(多個異步任務),以便從服務器獲取數據。

問題是當應用程序顯示ANR的應答數(異步任務)增加時。

有沒有更好的方法來處理這些場景,而不是爲每個web服務器調用(fling)創建異步任務。代碼

添加部分:

if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
      && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
     valuesDayWithTime=onStart(datePrevious); 
} 



public GraphView onStart(String date){ 
    urlFinal=createUrl(); 
    new DownloadDataTask(this).execute(urlFinal); 
} 

private class DownloadDataTask extends AsyncTask<String, Integer, Long> { 

    YieldActivity yActivity; 
    ProgressBar pBar ; 
    DownloadDataTask(YieldActivity act){ 
     yActivity=act; 
    } 

    protected void onPreExecute() { 
     relLay=(RelativeLayout) findViewById(R.id.graphView); 
     pBar 
     = new ProgressBar(yActivity); 
     LayoutParams lp =new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); 
     pBar.setLayoutParams(lp); 
     pBar.setMax(100); 
     relLay.removeAllViews(); 
     relLay.addView(pBar); 
    } 

    protected Long doInBackground(String... urls) { 
     int totalCount = urls.length; 
     for (int i = 0; i < totalCount; i++) { 
      publishProgress((int) ((i/(float) totalCount) * 100)); 
      downloadFromUrl(urls[i]); 
     } 
     return (long) totalCount; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     Log.i(progress[0] +"%"); 
    } 

    protected void onPostExecute(Long result) { 

     graphViewDay=calculate(dateNow,valuesDayWithTime); 
     relLay.removeView(pBar); 
     relLay.addView(graphViewDay); 


    } 
} 

public void downloadFromUrl(String fromURL) { 
    try { 
     getHttpResponse(fromURL.toString()); 

     parseResponse(); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
    } 
} 
+0

請發佈適合您的解決方案,以便其他人可以參考。 – 2011-04-21 16:02:44

回答

2

只要你在主線程創建的AsyncTask的對象,並要求從主線程對它們執行,不應該有任何問題。你能爲你的AsyncTask發佈一些僞代碼嗎? 您可以在AsyncTask here上找到更多信息。

+0

嗨advantej,我已經添加了一些代碼片段,我正在爲此做。 – Deva 2011-04-11 19:32:48

+0

您確定主線程(onPreExecute,onPostExecute和onProgressUpdate)上運行的DownloadTask的方法都不需要很長時間才能執行嗎?這是我認爲ANR會被拋出的唯一原因。 doInBackground中的任何長期任務都是可以接受的。 – advantej 2011-04-11 20:02:55