2013-05-14 5 views
6

In un'applicazione esistente ho un'attività con una classe interna che si estende AsyncTask, questo appare come il seguente:Chiamata AsyncTask da un'altra classe

public class Activity_1 extends BaseActivity { 
    .... 
    new async().execute(); 
    ... 

    public class asyncextends AsyncTask<Void, Void, String> { 
     protected String doInBackground(Void... progress) { ... } 
     protected void onPreExecute() { ... } 
     protected void onPostExecute(String result) { ... } 
    } 
} 

Ora, ho bisogno di chiamare lo stesso doInBackground-metodo da un altro attività, ma il onPostExecute() di questa classe interna opera su alcune variabili UI locali e quindi non è possibile utilizzarlo dall'esterno del clas. Esiste un modo per chiamare questo AsyncTask, e sovrascrivere il metodo onPostExecute e onPreExecute o devo creare un'altra classe interna nell'altra attività, fare la stessa cosa in background (ovviamente spostarlo nella classe di utilità comune) o qualcosa), ecc ...?

+0

[Che dire di tale soluzione] (http://stackoverflow.com/a/7618705/593709) –

risposta

19

È possibile effettuare una classe privata separata pacchetto di astratto, che si estende AsyncTask e l'attuazione di doInBackground() metodo:

abstract class MyAsyncTask extends AsyncTask<Void, Void, String> { 
    @Override 
    final protected String doInBackground(Void... progress) { 
     // do stuff, common to both activities in here 
    } 
} 

e nella vostra attività appena ereditano da MyAsyncTask (nuova classe probabilmente dovrebbe essere privata, tra l'altro), attuazione onPostExecute() e onPreExecute() metodi:

public class Activity_1 extends BaseActivity { 

    ... 
    new Async1().execute(); 
    ... 

    private class Async1 extends MyAsyncTask { 
     @Override 
     protected void onPreExecute(){ 
      // Activity 1 GUI stuff 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // Activity 1 GUI stuff 
     } 
    } 
} 

Se onPreExecute e onPostExecute contengono alcune azioni comuni così, è possibile applicare il seguente schema:

abstract class MyAsyncTask extends AsyncTask<Void, Void, String> { 
    public interface MyAsyncTaskListener { 
     void onPreExecuteConcluded(); 
     void onPostExecuteConcluded(String result); 
    } 

    private MyAsyncTaskListener mListener; 

    final public void setListener(MyAsyncTaskListener listener) { 
     mListener = listener; 
    } 

    @Override 
    final protected String doInBackground(Void... progress) { 
     // do stuff, common to both activities in here 
    } 

    @Override 
    final protected void onPreExecute() { 
     // common stuff 
     ... 
     if (mListener != null) 
      mListener.onPreExecuteConcluded(); 
    } 

    @Override 
    final protected void onPostExecute(String result) { 
     // common stuff 
     ... 
     if (mListener != null) 
      mListener.onPostExecuteConcluded(result); 
    } 
} 

e utilizzarlo nella vostra attività come segue:

public class Activity_1 extends BaseActivity { 

    ... 
    MyAsyncTask aTask = new MyAsyncTask(); 
    aTask.setListener(new MyAsyncTask.MyAsyncTaskListener() { 
     @Override 
     void onPreExecuteConcluded() { 
      // gui stuff 
     } 

     @Override 
     void onPostExecuteConcluded(String result) { 
      // gui stuff 
     } 
    }); 
    aTask.execute(); 
    ... 
}  

Si può anche avere il vostro Activity implementare MyAsyncTaskListener così:

public class Activity_1 extends BaseActivity implements MyAsyncTask.MyAsyncTaskListener { 
    @Override 
    void onPreExecuteConcluded() { 
     // gui stuff 
    } 

    @Override 
    void onPostExecuteConcluded(String result) { 
     // gui stuff 
    } 

    ... 
    MyAsyncTask aTask = new MyAsyncTask(); 
    aTask.setListener(this); 
    aTask.execute(); 
    ... 

} 

Ho scritto il codice dalla testa, quindi potrebbe contenere errori, ma dovrebbe illustrare l'idea.

+0

Esattamente qualcosa di simile stavo cercando. Cercherò di implementarlo per prima cosa domani mattina. – perene

+0

Ha funzionato come un fascino. Grazie! – perene

+0

Ottima risposta! Ma non riesco a capire perché sto ottenendo quanto segue per 'MyAsyncTask aTask = new MyAsyncTask();' _Cannot istanzia il tipo MySyncTask_ Qualsiasi aiuto sarebbe molto apprezzato! – Smittey

-1

Se creiamo un metodo statico che è in una classe e che verrà eseguito in qualsiasi classe in doInBackground di AsyncTask, possiamo facilmente aggiornare l'interfaccia utente attraverso la stessa classe e persino in classi diverse.

+0

Fornisci risposte con esempi concreti, solo una risposta FYI non è utile – Starlord

11

È così semplice, basta semplicemente creare un oggetto della classe principale e di chiamare la classe interna come questo

OuterMainClass outer = new OuterMainClass(); 
     outer.new InnerAsyncClass(param) 
     .execute(); 

questa risposta è troppo tardi per aiutare voi, ma spero che aiutare gli altri.

Grazie

+0

grazie davvero mi ha aiutato ... :) –

+0

Felice di aver aiutato qualcuno :) –

+0

hey puoi farmi un favore .. ha funzionato davvero bene ma ora ho devi restituire valore alla classe chiamante e come dovrei farlo ..? Ho chiamato la classe Asynctask da un'altra classe. quindi voglio ottenere risultato di asyncTask in quella classe chiamante. sai comunque come farlo? grazie :) –

0

1.Creare un costruttore di AsynckTask in ClassOne.

2.Crate oggetto o ClassOne con nuova parola chiave.

3.Call Async Task per oggetto

ClassOne{ 

class AsyncParmas extends AsyncTask { 

     public ADDloadGeofenceDetails() { 
     } 

     @Override 
     protected void onPreExecute() { 


      super.onPreExecute(); 
     } 

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

} 
} 

Class ClassTwo{ 
ClassOne obj= new ClassOne(); 

        obj.new AsyncParmas().execute(); 
} 
} 

GoodLuck Chi stavano affrontando problema.