web-dev-qa-db-fra.com

Asynctask: passez deux valeurs ou plus de doInBackground à onPostExecute

.
public class QueryServer extends AsyncTask <String, Void, Integer> { protected Integer doInBackground(String... serverAddress) { Log.d("QueryServer", ""+serverAddress[0]); MCQuery mcQuery = new MCQuery("" + serverAddress[0] ,25565); QueryResponse response = mcQuery.basicStat(); int Onlineplayers = response.getOnlinePlayers(); //first vaule int Maxplayers = response.getMaxPlayers(); //second vaule Log.d("MCQuery", "" + Onlineplayers + " OnlinePlayers"); return Onlineplayers; } protected void onPostExecute(Integer Onlineplayers){ TextView onlinePlayersView = (TextView) findViewById(R.id.online_players); onlinePlayersView.setText(""+Onlineplayers+"/"+ Maxplayers); //i need to pass Maxplayers to use it here }

.

23
Boris

Vous pouvez définir une classe Wrapper contenant deux entiers:

public class Wrapper
{
    public int onlinePlayers;
    public int maxPlayers;
}

et l'utiliser à la place de Integer:

public class QueryServer extends AsyncTask<String, Void, Wrapper> { 

    protected Wrapper doInBackground(String... serverAddress) {
        Log.d("QueryServer", ""+serverAddress[0]);
        MCQuery mcQuery = new MCQuery("" + serverAddress[0] ,25565);
        QueryResponse response = mcQuery.basicStat();

        int onlinePlayers = response.getOnlinePlayers(); //first vaule
        int maxPlayers = response.getMaxPlayers();  //second vaule

        Log.d("MCQuery", "" + onlinePlayers + " onlinePlayers");
        Wrapper w = new Wrapper();
        w.onlinePlayers = onlinePlayers;
        w.maxPlayers = maxPlayers;
        return w;

    }

    protected void onPostExecute(Wrapper w){

        TextView onlinePlayersView = (TextView) findViewById(R.id.online_players);

        onlinePlayersView.setText(""+w.onlinePlayers+"/"+ w.maxPlayers); //i need to pass Maxplayers to use it here


    }
58
Eng.Fouad
public class QueryServer extends AsyncTask <String, Void, Integer>{...}

Remplacez le paramètre générique Integer par ArrayList<Integer> ou par Integer[]

De cette façon, votre doInBackground() ressemblera à ceci:

protected Integer[] doInBackground(String... serverAddress) 
{
    ...do what you need to do...
    //Then create an array, fill with data, and return.
    Integer[] arr = new Integer[10];
    for(int i=0; i<10; i++)
        arr[i] = i; //just an example
    return arr;
}

Et le dans votre onPostExecute()

protected void onPostExecute(Integer [] Onlineplayers)
{
    //Do whatever you want with your array
}
3
Balázs Édes

Le moyen le plus simple consiste simplement à déclarer un petit objet conteneur avec les champs que vous voulez renvoyer, puis à en renvoyer une instance à partir de doInBackground:

private class QueryResult {
    int onlinePlayers;
    int maxPlayers;

    public QueryResult( int onlinePlayers, int maxPlayers ) {
        this.onlinePlayers = onlinePlayers;
        this.maxPlayers = maxPlayers;
    }
}

protected QueryResult doInBackground(String... serverAddress) {
    // ...

    return new QueryResult( onlinePlayers, maxPlayers );
}
2
mportuesisf

En règle générale, remplacez Integer par ArrayList of Objects. avec ce tableau, vous pouvez passer toute collection de tous types. mais évidemment, l’inconvénient est que vous devriez choisir les membres et connaître tous les types ...

0
Mehdi Khademloo

Avez-vous essayé de rendre ces deux membres membres de QueryServer

onPostExecute() ne fonctionne que lorsque doInBackground() est terminé, il ne devrait donc pas y avoir de problèmes de threading.

0
Steve Blackwell