1

UI がスコア (CPUScore と PlayerScore) の textView で構成されるボード ゲームを Android で作成しています。私が抱えている問題は、onCreate が呼び出されたときに UI がスコアを初期値から更新しないことです。同様の質問を見てきましたが、最も提案されている解決策は、AsyncTask を使用してバックグラウンドで UI スレッドを更新することです。ただし、AsyncTask で textViews を使用する方法を明示的に扱った解決策は見つかりませんでした。

これが私の試みです:

@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 メソッドで宣言した textViews を AsyncTask メソッドに転送するにはどうすればよいですか? 私は困惑しています。私はAndroid開発にかなり慣れていません。

4

2 に答える 2

2

a) TextView を設定した後に無効にする必要はないと確信しています。Android はそれを自動的に行う必要があります。

b)理論的には、TextView参照をメンバー変数に設定してからonPostExecute、に渡す代わりにそれらを参照しdoInBackgroundます。 doInBackground次に、新しいスコアを計算できるデータのビットを取得します。あなたが行うことはdoInBackground、新しいスコアが計算される原因となるアクションです。からの戻り値doInBackgroundが に渡されonPostExecuteます。次に、TextView (現在はメンバー変数) をこのデータで更新しますonPostExecute。それは理にかなっていますか?これらのスコア値を更新するコードを実際にここに投稿していません。

簡単な例については、こちらを参照してください。

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);
     }
});
于 2012-04-02T22:55:12.447 に答える
0

TextViewのコンストラクターで を渡し、メソッドAsyncTask から更新できますonPostExecute

private class updatePlayerScore extends AsyncTask<Void, Void, Integer> {
private TextView view;
public updatePlayerScore(TextView textView){
this.view = textView;
}
        @Override
            protected Integer doInBackground(Void... params) {
            int score = 0; 

                    //do you calculation the 

             return score;
         }
         protected void onPostExecute(Integer result) {
           view.setText(Integer.toString(result));
         }

     }

:何らかの理由でアクティビティ構成を変更した場合、つまりユーザーがデバイスを回転させ、AsyncTaskタスクを完了していない場合、更新はTextView更新されないため、AsyncTask のインスタンスを保持し、TextView を更新する必要があります

于 2012-04-02T23:00:51.497 に答える