Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Asynctask:将两个或多个值从doInBackground传递到onPostExecute_Java_Android_Android Asynctask - Fatal编程技术网

Java Asynctask:将两个或多个值从doInBackground传递到onPostExecute

Java Asynctask:将两个或多个值从doInBackground传递到onPostExecute,java,android,android-asynctask,Java,Android,Android Asynctask,我有一个Asynctask,它检索两个int值,我想将它们传递给onPostExecute,以便在视图上显示它们。 这是我的密码: public class QueryServer extends AsyncTask <String, Void, Integer> { protected Integer doInBackground(String... serverAddress) { Log.d("QueryServer", ""+serverA

我有一个Asynctask,它检索两个int值,我想将它们传递给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


    }
公共类QueryServer扩展异步任务{
受保护的整数doInBackground(字符串…服务器地址){
Log.d(“QueryServer”,即“+serverAddress[0]);
MCQuery-MCQuery=new-MCQuery(“+serverAddress[0],25565”);
QueryResponse response=mcQuery.basicStat();
int Onlineplayers=response.getOnlinePlayers();//第一个值
int Maxplayers=response.getMaxPlayers();//第二个值
Log.d(“MCQuery”和“+在线玩家+”在线玩家”);
返回在线玩家;
}
受保护的void onPostExecute(整数OnlinePlayer){
TextView OnlinePlayerView=(TextView)findViewById(R.id.online_播放器);
onlinePlayersView.setText(“+Onlineplayers+”/“+Maxplayers);//我需要传递Maxplayers才能在这里使用它
}

提前感谢。

您可以定义一个包含两个整数的包装器类:

public class Wrapper
{
    public int onlinePlayers;
    public int maxPlayers;
}
并用它代替
整数

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


    }
公共类QueryServer扩展异步任务{
受保护的包装器doInBackground(字符串…服务器地址){
Log.d(“QueryServer”,即“+serverAddress[0]);
MCQuery-MCQuery=new-MCQuery(“+serverAddress[0],25565”);
QueryResponse response=mcQuery.basicStat();
int onlinePlayers=response.getOnlinePlayers();//第一个值
int maxPlayers=response.getMaxPlayers();//第二个值
Log.d(“MCQuery”和“+在线玩家+”在线玩家”);
包装器w=新包装器();
w、 在线玩家=在线玩家;
w、 最大玩家=最大玩家;
返回w;
}
受保护的void onPostExecute(包装器w){
TextView OnlinePlayerView=(TextView)findViewById(R.id.online_播放器);
onlinePlayersView.setText(“+w.onlinePlayers+”/“+w.maxPlayers);//我需要传递给maxPlayers才能在这里使用它
}

最简单的方法是声明一个包含要返回字段的小容器对象,然后从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 );
}
以及您的
onPostExecute()


您是否尝试过使这两个ints成员成为
QueryServer


onPostExecute()
doInBackground()之后才会运行
已完成,因此不应存在任何线程问题。

一般来说,将
整数
替换为
数组对象列表
。使用此数组,您可以传递任何类型的任何集合。但显然,缺点是您应该强制转换成员,并且您应该知道所有类型…

谢谢,简单有效
public class QueryServer extends AsyncTask <String, Void, Integer>{...}
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;
}
protected void onPostExecute(Integer [] Onlineplayers)
{
    //Do whatever you want with your array
}