373 votes

Comment obtenir le résultat de OnPostExecute () sur l'activité principale car AsyncTask est une classe distincte?

J'ai cette classe deux. Mon activité principale et celle qui étend la tâche AsyncTask, maintenant dans mon activité principale, je dois obtenir le résultat de OnPostExecute dans AsyncTask. Comment puis-je réussir ou obtenir le résultat dans mon activité principale?

Voici les exemples de codes.

Mon activité principale

 public class MainActivity extends Activity{

    AasyncTask asyncTask = new AasyncTask();

    @Override
    public void onCreate(Bundle aBundle) {
        super.onCreate(aBundle);            

        //Calling the AsyncTask class to start to execute.  
        asyncTask.execute(a.targetServer); 

        //Creating a TextView.
        TextView displayUI = asyncTask.dataDisplay;
        displayUI = new TextView(this);
        this.setContentView(tTextView); 
    }

}
 

Ceci est la classe AsyncTask

 public class AasyncTask extends AsyncTask<String, Void, String> {

TextView dataDisplay; //store the data  
String soapAction = "http://sample.com"; //SOAPAction header line. 
String targetServer = "https://sampletargeturl.com"; //Target Server.

//SOAP Request.
String soapRequest = "<sample XML request>";    



@Override
protected String doInBackground(String... string) {

String responseStorage = null; //storage of the response

try {


    //Uses URL and HttpURLConnection for server connection. 
    URL targetURL = new URL(targetServer);
    HttpURLConnection httpCon = (HttpURLConnection) targetURL.openConnection();
    httpCon.setDoOutput(true);
    httpCon.setDoInput(true);
    httpCon.setUseCaches(false); 
    httpCon.setChunkedStreamingMode(0);

    //properties of SOAPAction header
    httpCon.addRequestProperty("SOAPAction", soapAction);
    httpCon.addRequestProperty("Content-Type", "text/xml; charset=utf-8"); 
    httpCon.addRequestProperty("Content-Length", "" + soapRequest.length());
    httpCon.setRequestMethod(HttpPost.METHOD_NAME);


    //sending request to the server.
    OutputStream outputStream = httpCon.getOutputStream(); 
    Writer writer = new OutputStreamWriter(outputStream);
    writer.write(soapRequest);
    writer.flush();
    writer.close();


    //getting the response from the server
    InputStream inputStream = httpCon.getInputStream(); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(50);

    int intResponse = httpCon.getResponseCode();

    while ((intResponse = bufferedReader.read()) != -1) {
        byteArrayBuffer.append(intResponse);
    }

    responseStorage = new String(byteArrayBuffer.toByteArray()); 

    } catch (Exception aException) {
    responseStorage = aException.getMessage(); 
    }
    return responseStorage;
}

protected void onPostExecute(String result) {

    aTextView.setText(result);

}       

}   
 

773voto

HelmiB Points 3420

facile. créer interface class.

 public interface AsyncResponse {
    void processFinish(String output);
}
 

dans votre classe Async, vous devez le déclarer (interface: AsyncResponse):

 public class MyAsyncTask extends AsyncTask{
public AsyncResponse delegate=null;

   @Override
   protected void onPostExecute(String result) {
      delegate.processFinish(result);
   }
 

Etape finale: dans votre activité principale, vous devez créer implements interface que vous avez créée précédemment AsyncResponse .

 public class MainActivity implements AsyncResponse{
   MyAsyncTask asyncTask =new MyAsyncTask();
    @Override
    public void onCreate(Bundle savedInstanceState) {
     asyncTask.delegate = this;
    }


   void processFinish(String output){
     //this you will received result fired from async class of onPostExecute(result) method.
   }
}
 

25voto

user113215 Points 4402

Il ya quelques options:

  • Nid de l' AsyncTask de la classe dans votre Activity classe. En supposant que vous n'utilisez pas la même tâche dans de multiples activités, c'est le moyen le plus facile. Tout votre code reste le même, il suffit de déplacer la tâche existante de la classe à une classe imbriquée à l'intérieur de votre activité de la classe.

    public class MyActivity extends Activity {
        // existing Activity code
        ...
    
        private class MyAsyncTask extends AsyncTask<String, Void, String> {
            // existing AsyncTask code
            ...
        }
    }
    
  • Créer un constructeur personnalisé pour votre AsyncTask qui prend une référence à votre Activity. Vous instancier la tâche avec quelque chose comme new MyAsyncTask(this).execute(param1, param2).

    private class MyAsyncTask extends AsyncTask<String, Void, String> {
        private Activity activity;
    
        public MyAsyncTask(Activity activity) {
            this.activity = activity;
        }
    
        // existing AsyncTask code
        ...
    }
    

6voto

user3691697 Points 11

dans votre Oncreate() :

`

}`

2voto

Oleg Karbushev Points 1

Salut vous pouvez faire quelque chose comme ceci :

  1. Créer la classe qui implémente AsyncTask
  2. Ajouter dans l’activité principale

1voto

mrres1 Points 620

Créer un membre statique dans la classe de votre activité. Puis assigner la valeur au cours de la``

Par exemple, si le résultat de votre AsyncTask est une chaîne, créez une chaîne statique publique dans votre activité

``

Ensuite, dans la `` de la AsyncTask, faites simplement un statique appelez à votre classe principale et affectez la valeur.

``

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X