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;
}
}
Iscriviti a:
Commenti sul post (Atom)
Dockerizza Flask
Un esempio semplice per inserire in un container Docker una applicazione Flask Partiamo da una semplice applicazione che ha un file app.py ...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
Nessun commento:
Posta un commento