AsyncTask,doInBackground似乎不起作用

时间:2014-05-23 14:04:51

标签: android android-asynctask

我有AsyncTask代码

public class DiceTask extends AsyncTask<Socket, Void, int[]> {

private int[] arrayFromServer = new int[8];

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected int[] doInBackground(Socket...params) {
    Socket soc = params[0];

    try {
        ObjectInputStream ois = new ObjectInputStream(soc.getInputStream());
        int[] tempArray = (int[]) (ois.readObject());
        return tempArray;
    } catch (IOException | ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }

}

@Override
protected void onProgressUpdate(Void...arg1) {

}

@Override
protected void onPostExecute(int[] result) {
    arrayFromServer = result;

}

public int[] getTempDice() {
    return arrayFromServer;
}
}

这里以这种方式调用我的主线程。

rollDiceButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            rollDiceButton.setEnabled(false);
            rollDice();
            task.execute(socket);
            tempArray = task.getTempDice();
            printDice(tempArray,pDice);
            clickableDice(pDice);
        }
    });

我得到的是null tempArray。如果我将onPreExecute更改为此

@Override
protected void onPreExecute() {
    super.onPreExecute();
    for(int i = 0; i < arrayFromServer.length; i++) {
        arrayFromServer[i] = 1;
    }
}

我正在接受我的骰子,一切都是一个。我在rollDice()中遇到的代码就是这个

public void rollDice() {

    try {
        DataOutputStream sout = new DataOutputStream(socket.getOutputStream());
        String line = "dice";
        PrintStream out = new PrintStream(sout);
        out.println(line);
    } catch (UnknownHostException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }


}

我可以在服务器中看到结果。

2 个答案:

答案 0 :(得分:0)

AsyncTask的孩子与主Thread并行运行,您正试图立即访问属性arrayFromServer以启动Thread。建议您使用回调来重试所需的值,确保在Thread完成后获得值。

进行以下更改可以解决您的问题。如果你理解,请告诉我。

public class DiceTask extends AsyncTask<Socket, Void, int[]> {

    public interface Callback {
        void onDone(int[] arrayFromServer);
    }

    private Callback mCallback;

    public DiceTask(Callback c) {
        mCallback = c;
    }

    @Override
    protected int[] doInBackground(Socket...params) {
        Socket soc = params[0];

        try {
            ObjectInputStream ois = new ObjectInputStream(soc.getInputStream());
            int[] tempArray = (int[]) (ois.readObject());
            return tempArray;
        } catch (IOException | ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }

    }


    @Override
    protected void onPostExecute(int[] result) {
        mCallback.onDone(result);
    }

}




rollDiceButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        rollDiceButton.setEnabled(false);
        rollDice();
        new DiceTask(new Callback() {
             public void onDone(int[] tempArray) {
                  printDice(tempArray,pDice);
                  clickableDice(pDice);
             }
        }).execute(socket);

    }
});

答案 1 :(得分:0)

您不需要在AsyncTask类定义中实现onPostExecute。您也不需要getTempDice功能。您只需要在匿名类中覆盖onPostExecute并在其中运行您的UI代码。

rollDiceButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        rollDiceButton.setEnabled(false);
        rollDice();
        task = new DiceTask() {
            @Override
            public void onPostExecute(int[] result) {
                tempArray = result;
                printDice(tempArray,pDice);
                clickableDice(pDice);
            }
        }.execute(socket);
    }
});