gpt4 book ai didi

android - 使用 AsyncTask 刷新游戏得分 TextView

转载 作者:行者123 更新时间:2023-11-29 22:09:35 25 4
gpt4 key购买 nike

我正在 Android 中编写棋盘游戏,其中 UI 由分数的 TextView (CPUScore 和 PlayerScore)组成。我遇到的问题是,当调用 onCreate 时,UI 不会从其初始值更新分数。我看过类似的问题,最建议的解决方案是使用 AsyncTask 在后台更新 UI 线程。但是,我没有找到明确处理如何在 AsyncTask 中使用 textView 的解决方案。

这是我的尝试:

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
//....
setContentView(R.layout.main_layout);

//.....
//------------ textViews declared here don't refresh -------------------
TextView playerScoreForm = (TextView) findViewById(R.id.PlayerTotalScore);
playerScoreForm.setText(Integer.toString(PlayerTotal));
playerScoreForm.invalidate();

TextView CPUScoreForm = (TextView) findViewById(R.id.CPUTotalScore);
CPUScoreForm.setText(Integer.toString(CPUTotal));
CPUScoreForm.invalidate();
//--------------------------------------------------------------------------
//AsyncTask method:
new updatePlayerScore().execute(PlayerTotal);
new updateCPUScore().execute(CPUScoreForm);
}

AsyncTask 子类:

private class updatePlayerScore extends AsyncTask<TextView, Void, Void> {

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


// what to put here??



}
return playerScoreForm;
}

@Override
protected void onProgressUpdate(Integer... values) {
//??
}

protected void onPostExecute(Integer result) {
playerScoreForm.setText(Integer.toString(result));
}

}


private class UpdateCPUScore extends AsyncTask<TextView, Integer, Integer> {
// same syntax as updatePlayerScore

}

问题:如何将我在 onCreate 方法中声明的 textView 传输到 AsyncTask 方法?我很难过。我是 Android 开发的新手。

最佳答案

a) 我很确定您不需要在设置 TextView 后使它们失效; Android 应该会自动执行此操作。

b) 理论上,您会将 TextView 引用设置为成员变量,然后在 onPostExecute 中引用它们,而不是将它们传递到 doInBackgrounddoInBackground 将依次获取使您能够计算新分数的任何数据位。您将在 doInBackground 上执行的操作是会导致计算新分数的任何操作。 doInBackground 的返回值被传递到 onPostExecute。然后,您将在 onPostExecute 中使用此数据更新 TextView(现在是成员变量)。那有意义吗?您实际上并未在此处发布任何可更新这些分值的代码。

参见 here举个简单的例子。

private TextView myScoreView;  //initialized in onCreate as you do above.


@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
//....
setContentView(R.layout.main_layout);

//.....

myScoreView = (TextView) findViewById(R.id.PlayerTotalScore);
myScoreView.setText(Integer.toString(PlayerTotal));

new updatePlayerScore().execute(1,2); //parameters for calculation
}

private class updatePlayerScore extends AsyncTask<Integer, Integer, Integer> {

@Override
protected TextView doInBackground(Integer... params) {

int score = params[0] + 2 * params[1];
return score;
}


@Override
protected void onProgressUpdate(Integer... values) {
//if you want to provide some indication in the UI that calculation
//is happening, like moving a progress bar, that's what you'd do here.
}

@Override
protected void onPostExecute(Integer scoreCalculationResult) {
myScoreView.setText(Integer.toString(scoreCalculationResult));
}

}

编辑:如果您不想在 doInBackgroundThread 中执行计算逻辑,您可能只想使用:

runOnUiThread(new Runnable(){
@Override
public void run(){
myScoreView.setText(PlayerScoreValue);
}
});

或者:

 myScoreView.post(new Runnable(){
@Override
public void run(){
myScoreView.setText(PlayerScoreValue);
}
});

关于android - 使用 AsyncTask 刷新游戏得分 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9984909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com