每次或仅一次异步任务更新值?

时间:2013-10-03 16:41:03

标签: android android-asynctask

我正在使用异步任务来处理后台计算。但我想每次在屏幕上更新我的计算值。我怎么能使用异步任务来做到这一点。使用post post方法在屏幕上获取更新值的任何可能性。

public class HandleDataManuplation extends AsyncTask<String, Void, String>
{

    @Override
    protected String doInBackground(String...v) {
        //totalKm=gpsdataElements.Distance-Contsants.jobStartKm;

        if(gpsdataElements.Speed<0.4)
        {
            Contsants.cont_WaitingTimeInSec++;
        }


        if (totalKm<Contsants.minDist)
        {
            totalfare= Contsants.minFare;
            //tv_Fare.setText(String.format("%.2f",(totalfare))); 
        }
        else
        {
            totalfare= 110+ ((totalKm-Contsants.minDist) *Contsants.rupeeKm)  +(Contsants.cont_WaitingTimeInSec/60)*1;
            //tv_Fare.setText(String.format("%.2f",(totalfare))); 
        }
        return null;


    }
    @Override
    protected void onPostExecute(String result) {

        tv_speed.setText(String.format("%.2f",gpsdataElements.Speed*1.852)+" Km/hr");
        tv_JobwaitngTime.setText(Integer.toString((Contsants.cont_WaitingTimeInSec / 60)) +":"+ Integer.toString((Contsants.cont_WaitingTimeInSec% 60)));
        tv_speed.setText(String.format("%.2f",gpsdataElements.Speed*1.852)+" Km/hr");
        tv_JobwaitngTime.setText(Integer.toString((Contsants.cont_WaitingTimeInSec / 60)) +":"+ Integer.toString((Contsants.cont_WaitingTimeInSec% 60)));

    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Void... values) {
    }
}

3 个答案:

答案 0 :(得分:2)

你可以用onProgressUpdate()来做到这一点。它是AsyncTask类的方法

示例代码:

  @Override
    protected Void doInBackground(Integer... integers) {

        //This is where you do calculation
        //for now I'm just going to loop for 10 seconds
        // publishing progress every second



        for (int i=10; i<=100; i += 10)
            {
                try {

                    publishProgress(i);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        return null;
    }
    protected void onProgressUpdate(Integer... progress) {

        //This method runs on the UI thread, it receives progress updates
        //from the background thread and publishes them to the status bar

        // show progress bar here
    }

答案 1 :(得分:0)

以下是如何使用AsyncTask

的示例
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         // Do your calcutlation
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         //update your calcultaion
     }

     protected void onPostExecute(Long result) {
         //pass the result of Your calcutlation
     }
 }

答案 2 :(得分:0)

onPostExecute()只会被调用一次(当doInBackground()时)完成并返回其值。

您可以在计算后每次publishProgress()致电doInBackground() onProgressUpdate()

From the Docs

  

onProgressUpdate(Progress ...),在调用publishProgress(Progress ...)后在UI线程上调用。执行的时间是不确定的。此方法用于在后台计算仍在执行时显示用户界面中的任何形式的进度。例如,它可用于为进度条设置动画或在文本字段中显示日志。