Ho giocato con vari esempi cercando di familiarizzare con AsyncTask. Finora tutti gli esempi che ho visto hanno avuto l'AsyncTask incluso nel metodo onCreate dell'attività principale. Il che non mi piace molto, quindi volevo vedere quanto sarebbe difficile separarlo nella sua stessa classe. Finora ho questo:Sviluppo Android: Avere un AsyncTask in un file di classe separato
il attività principale
package com.example.asynctaskactivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.example.asynctaskactivity.ShowDialogAsyncTask;
public class AsyncTaskActivity extends Activity {
Button btn_start;
ProgressBar progressBar;
TextView txt_percentage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn_start = (Button) findViewById(R.id.btn_start);
progressBar = (ProgressBar) findViewById(R.id.progress);
txt_percentage= (TextView) findViewById(R.id.txt_percentage);
Log.v("onCreate","Attempt set up button OnClickListener");
btn_start.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
btn_start.setEnabled(false);
new ShowDialogAsyncTask().execute();
}
});
Log.v("onCreate","Success!");
}
}
la nuova separata classe AsyncTask
package com.example.asynctaskactivity;
import android.os.AsyncTask;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class ShowDialogAsyncTask extends AsyncTask<Void, Integer, Void>{
int progress_status;
@Override
protected void onPreExecute() {
// update the UI immediately after the task is executed
Log.v("onPreExecute","1");
super.onPreExecute();
Log.v("onPreExecute","2");
//Toast.makeText(AsyncTaskActivity.this,"Invoke onPreExecute()", Toast.LENGTH_SHORT).show();
progress_status = 0;
Log.v("onPreExecute","3");
txt_percentage.setText("downloading 0%");
Log.v("onPreExecute","4");
}
@Override
protected Void doInBackground(Void... params) {
Log.v("doInBackground","1");
while(progress_status<100){
progress_status += 2;
publishProgress(progress_status);
SystemClock.sleep(300);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
txt_percentage.setText("downloading " +values[0]+"%");
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//Toast.makeText(AsyncTaskActivity.this,"Invoke onPostExecute()", Toast.LENGTH_SHORT).show();
txt_percentage.setText("download complete");
btn_start.setEnabled(true);
}
}
In origine questo era tutto nell'attività principale, da cui il menzioni al elementi che l'asynctask dovrebbe in teoria aggiornare. Ovviamente al momento questo sta causando errori di runtime, che poi mi hanno fatto pensare. Come posso avere il file separato, ma continuo ad aggiornare il thread dell'interfaccia utente.
Scusa se questa è una domanda stupida, piuttosto nuova per lo sviluppo Android e thread in background in particolare.
Sembra molto simile a questo http: // StackOverflow.it/questions/6119305/android-how-to-run-asynctask-from-different-class-file – user2070018
Come sidenote, non è necessario chiamare i metodi super in un 'AsyncTask', non fanno nulla. – nhaarman
Qual è il punto in loro in realtà, li ho notati in molti esempi di asynctasks che stavo guardando e non riuscivo a capire il loro scopo. – cosmicsafari