martedì 17 aprile 2012

AsyncTask e Pi Greco

Partendo da un esempio ripreso da qui e' stato possibile sviluppare un programma che evita il problema del post precedente, ovvero viene sviluppato un calcolo molto lungo senza che Android generi un errore.
Il sistema si basa sull'utilizzo dei task asincroni.

Il programma che calcola il valore di Pi Greco mediante il metodo di Montecarlo
Il task asincrono viene lanciato dall'evento EventTouch..per evitare che pressioni multiple possano generare piu' task asincroni viene settata la variaible booleana corre quando il primo task asincrono parte e non viene rilasciata fino al suo termine
-------------------------------------------------------------------------------
package com.async;

import java.util.Random;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;

public class AsyncActivity extends Activity {
  //queste variabili sono visibili sia dal Main che dal TaskAsync

boolean corre;
double q = 0;
private TextView pi;

//*********** Task Asincrono per il calcolo
public class BackgroundAsyncTask extends  AsyncTask<Void, Boolean, Void> {
 

private ProgressDialog pDialog;

@Override
 protected Void doInBackground(Void... params) {


     //calcolo di PiGreco
     double s = 0;
     int max_cicli = 10000;
     Random generator = new Random();
   
     for (int t=0;t<max_cicli;t++)
     {
         Log.d("task",Double.toString(t));
         double x = (2*generator.nextDouble())-1;
         double y = (2*generator.nextDouble())-1;
         double a = (x*x)+(y*y);
         if (a<=1)
             {
             s++;
             }
     }
     q = (4*s/max_cicli);
 return null;
 }

 @Override
 protected void onPostExecute(Void result) {

//evento generato al termine del task
  corre = false;
  pDialog.dismiss();
  pi.setText(Double.toString(q));
 }

 @Override
 protected void onPreExecute() {

//evento generato all'inizio del task
  corre = true;
  pDialog = ProgressDialog.show(AsyncActivity.this,"Prego attendere...", "Calcolo in corso ...", true);
 }

 @Override
 protected void onProgressUpdate(Boolean... values) {

 }
}

//******** MAIN
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      pi = (TextView) findViewById(R.id.pigreco);
  }

  public boolean onTouchEvent(MotionEvent event)
  {
  if (!corre) new BackgroundAsyncTask().execute();
  return false;
  }
}