Newsgroup: it.comp.java
Titolo: [ANDROID] Problema con AsyncTask

Sto leggendo un libro sulla programmazione Android, e non riesco a usare 
la classe "AsyncTask".
Questo esempio di uso di "AsyncTask" e' ridotto all'osso.
Il programma NON parte, qualcuno mi spiega il perche?
 
 
 
package com.prove.provaproject_24;
 
import com.prove.provaproject_23.MainActivity.BackgroundTask;
 
import android.support.v7.app.ActionBarActivity;
import android.os.*;
import android.os.Bundle;
import android.view.Menu;
import android.view.*;
import android.widget.*;
import android.app.*;
 
public class MainActivity extends ActionBarActivity {
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
 
		new BackgroundTask().execute();
	}
 
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
 
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
 
	class BackgroundTask extends AsyncTask<Void, Integer, String>
	{
         @Override
         protected void onPreExecute()
         {
             super.onPreExecute();
         }
 
         @Override
         protected String doInBackground(Void... arg0)
         {
         	Thread.sleep(1200);
         	return("Fine del background");
         }
 
         @Override
         protected void onPostExecute()
         {
             super.onPostExecute(result);
             Toast.makeText(MainActivity.this, result, 
Toast.LENGTH_SHORT).show();
         }
	}
 
}
 
---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
http://www.avast.com
 
 

 Il programma NON parte, qualcuno mi spiega il perche?
Come fai a dire che non parte?
Nell'AndroidManifest.xml e' descritta MainActivity?
Inoltre, perche' utilizzare ActionBarActivity che e' una roba vecchia? 
Utilizza Activity.
Da quanto vedo l'app parte e dopo 1.2 secondi mostra un toas breve, 
magari non l'hai visto. Prova a utilizzare LENGTH_LONG.
 

 magari non l'hai visto. Prova a utilizzare LENGTH_LONG.
 
 
A me il programma NON funziona, di seguito posto tutto.
Le classi mi sembra di averle importate tutte.
 
********** MainActivity.java **********
package com.prove.provaproject_asynctask;
 
import com.prove.provaproject_asynctask.MainActivity.BackgroundTask;
 
import com.prove.provaproject_asynctask.MainActivity.*;
 
import com.prove.provaproject_23.MainActivity.BackgroundTask;
 
import com.prove.provaproject_23.MainActivity.*;
 
import android.support.v7.app.ActionBarActivity;
import android.os.*;
import android.os.Bundle;
import android.view.Menu;
import android.view.*;
import android.widget.*;
import android.app.*;
 
public class MainActivity extends Activity

********** AndroidManifest.xml **********
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="
http://schemas.android.com/apk/res/android
"
     package="com.prove.provaproject_asynctask"
     android:versionCode="1"
     android:versionName="1.0" >
 
     <uses-sdk
         android:minSdkVersion="8"
         android:targetSdkVersion="21" />
 
     <application
         android:allowBackup="true"
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
         android:theme="@style/AppTheme" >
         <activity
             android:name=".MainActivity"
             android:label="@string/app_name" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category 
android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
     </application>
 
</manifest>
 
********** activity_main.xml **********
<RelativeLayout xmlns:android="
http://schemas.android.com/apk/res/android
"
     xmlns:tools="
http://schemas.android.com/tools
"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:paddingBottom="@dimen/activity_vertical_margin"
     android:paddingLeft="@dimen/activity_horizontal_margin"
     android:paddingRight="@dimen/activity_horizontal_margin"
     android:paddingTop="@dimen/activity_vertical_margin"
     tools:context="com.prove.provaproject_asynctask.MainActivity" >
 
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/hello_world" />
 
</RelativeLayout>


AsyncTask ha tre parametri generics, mettiamo AsyncTask<Void, Integer, 
String>
 
Void e' il tipo in entrata del metodo "doInBackground" e String il tipo 
di ritorno?
String e' anche il tipo in entrata del metodo "onPostExecute" ?
Riguardo il tipo Integer cosa c'e' da dire?
 
Nel costrutto "protected String doInBackground(Void... arg0)" che 
significa "Void..." ?
E' un array? Equivale a scrivere "Void[]" ?
 
Qualcuno puo' farmi un piccolo e semplice esempio di uso di AsyncTask ?


 Qualcuno puo' farmi un piccolo e semplice esempio di uso di AsyncTask ?
 
http://developer.android.com/reference/android/os/AsyncTask.html
 
 

 Qualcuno puo' farmi un piccolo e semplice esempio di uso di AsyncTask ?
Se guardi la documentazione di AsyncTask la sezione Usage parte con un 
esempio: 
http://developer.android.com/reference/android/os/AsyncTask.html
 
 
Un'avvertenza: non ti aspettare che il metodo postExecute venga sempre 
chiamato, Android e' fatto cosï¿œ! Sull'internet troverai un sacco di 
gente che se ne lamenta... La Classe AsyncTask e' basata su un Executor 
di cui non hai il controllo, meglio utilizzare 
ExecutorService/Callable/Future classici.
 

Questo programma di prova di AsyncTask e' ridotto all'osso, non credo 
che sia possibile scrivere un programma
piu' semplice. Il programma dovrebbe non fare nulla e dopo 3 secondi far 
apparire un Toast con la scritta
"Task in background terminato".
Il programma NON funziona, PERCHE?
 
Di solito commetto l'errore di non importare tutte le classi, in questo 
programma mi sembra di averle importate
tutte.
 
********** MainActivity.java **********
 
package com.prove.provaproject_asynctask;
 
import android.app.*;
import android.os.AsyncTask;
import android.os.*;
import android.view.*;
import android.view.MenuItem;
import android.widget.*;
import android.content.*;
 
public class MainActivity extends Activity
{
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         new ProvaAsyncTask().execute();
     }
 
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         // Inflate the menu; this adds items to the action bar if it is 
present.
         getMenuInflater().inflate(R.menu.main, menu);
         return true;
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         // Handle action bar item clicks here. The action bar will
         // automatically handle clicks on the Home/Up button, so long
         // as you specify a parent activity in AndroidManifest.xml.
         int id = item.getItemId();
         if (id == R.id.action_settings) {
             return true;
         }
         return super.onOptionsItemSelected(item);
     }
 
     // Classe interna
     private class ProvaAsyncTask extends AsyncTask<Void, Integer, String>
     {
     	protected String doInBackground(Void... v)
         {
             Thread.sleep(3000);
             return("Task in background terminato");
         }
 
         protected void onPostExecute(String result)
         {
         	Toast.makeText(MainActivity.this, result, 
Toast.LENGTH_LONG).show();


 Il programma NON funziona, PERCHE?
 
un consiglio, se sei incazzato prenditi una pausa per fartela passare. 
tanto se pensi di andare avanti a forza di domande da utonto isterico non 
farai progressi.
poi con calma ti metti lì e segni su un blocco note l'errore esatto e 
quale operazione l'ha causato. capisci che non puoi pensare di salire sul 
carro dei programmatori se non ti è chiaro l'inutilità della domanda che 
hai fatto e per di più con quel tono fastidioso. 
 
se vuoi essere aiutato devi almeno dimostrare che non è un impegno 
totalmente inutile. sappi che non lo stai dimostrando affatto.

 Il programma NON funziona, PERCHE?
Forse ti si e' rotto il telefono?
 
Io ti ho fatto delle domande proprio per capire cosa potrebbe essere. 
Per esperienza, gli errori che si possono commettere scrivendo le 
applicazioni android, senza contare le infinita' di bug nel sdk, sono 
moltissime. Sena un minimo di descrizione le supposizioni potrebbero 
essere altrettante.
 
In genere se lanci l'applicazione da eclipse nei log ti dice cosa sta 
facendo, e se qualcosa non funziona te lo scrive in rosso: le famose 
Exception!
Magari l'errore e' nel R.layout.activity_main. Almeno la classe te la 
compila?
 

 compila?
 
 
Di solito commetto l'errore di non importare tutte le classi, in questo 
programma mi sembra di averle importate tutte.
 
Quando su Eclipse clicco su "Run>Run As>Android Application" mi appare 
una finestra intitolata "Android Launch"
con il testo "Your project contains error(s), please fix them before 
running your application".
 
I pannelli "Console" e "LogCat" sono entrambi completamente vuoti.



NON mi sembra di aver usato un tono fastidioso, comunque mi scuso.


TROVATA la soluzione!
 
Si trattava di mettere un try/catch intorno a "Thread.sleep(3000);"
Di seguito posto il programma.
 
Eclipse mi sembra CARENTE nella gestione degli errori di programmazione,
non dovrebbe avvisare quando c'e' bisogno di un try/catch ?
Quando si lancia il programma Eclipse non dovrebbe indicare se ci sono
classi che necessitano di un "import" ?
 
 
********** MainActivity.java **********
 
package com.prove.provaproject_asynctask;
 
import android.app.*;
import android.os.*;
import android.view.*;

             try
             {
		Thread.sleep(3000);
	    }
             catch (InterruptedException e)
	    {
		e.printStackTrace();
	    }
             return("Task in background terminato");
         }
 
         protected void onPostExecute(String result)
         {
         	Toast.makeText(MainActivity.this, result, 
Toast.LENGTH_LONG).show();
         }
     }
 
}
 
 


 classi che necessitano di un "import" ?
 
quelli sono errori di compilazione non runtime. eclipse li segnala eccome, 
addirittura mentre editi il file. non solo ti propone anche la soluzione.
 
magari se quando vedi delle sottolineature rosse non le ignorassi...
 

 magari se quando vedi delle sottolineature rosse non le ignorassi...
 
 
E' da circa una settimana che mi sono messo a imparare a programmare per 
Android, questo discorso delle
sottolineature rosse non lo sapevo, grazie.
