Проблем с показването на TextView в реално време с помощта на asyncTask

Уча се как да използвам asyncTask и имам проблем с опита да покажа TextView в реално време. MainActivity има няколко бутона, които ще стартират нова дейност плюс TextView, който показва стойността, която се променя на всеки 200 милисекунди. Но проблемът е, че TextView не се показва, докато не щракна върху бутона, за да започна друга дейност, и стойността не се променя, когато натисна "бутона за връщане", за да се върна към mainActivity. Той обаче променя стойността, когато натисна бутона, за да започна друга дейност.

private TextView t;
private int counter;
private boolean isUiVisible = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    t = (TextView) findViewById(R.id.counter);
    counter = 0;
}

@Override
public void onStart(){
    super.onStart();
    isUiVisible = true;
    new UpdateUi().execute();
}

@Override
public void onPause(){
    super.onPause();
    isUiVisible = false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

private class UpdateUi extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        while (true) {
            if (isUiVisible) {
                counter++;
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                // Ensure the asynkTask ends when the activity ends
                break;
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        t.setText(counter + "");
    }
}

public void callRed(View view){
    Intent intent = new Intent(this, RedActivity.class);
    startActivity(intent);
}

public void callYellow(View view){
    Intent intent = new Intent(this, YellowActivity.class);
    startActivity(intent);
}

Опитах setText в onProgressUpdate, но не показа нищо. Също така потърсих, за да видя дали други имат проблеми, но изглежда, че имат същия проблем като моя (единият беше onClickListener, което не беше това, което търсех).


person luch0043    schedule 12.07.2013    source източник
comment
Първо, опитайте да направите това onResume() вместо да правите на onStart(). Докато новата дейност не скрие напълно старата, onStart() може да не се извика @Override public void onResume(){ super.onResume(); isUiVisible = true; new UpdateUi().execute(); }   -  person Shobhit Puri    schedule 13.07.2013
comment
За съжаление това не реши проблема, който имам. Но отговорът на type-a1pha разреши проблема. Благодаря за помощта.   -  person luch0043    schedule 14.07.2013


Отговори (1)


TextView не се показва вероятно, защото няма текст вътре...не мога да кажа със сигурност, без да гледам файла layout.xml.

Получавате това поведение, защото променливата isUiVisible става невярна само когато се извика onPause(), т.е. когато превключите дейността. В този момент AsyncTask излиза от своя doInBackground метод и изпълнява onPostExecute, което поставя някакъв текст в TextView, което го прави да се появи.

За да опитате да коригирате кода си, трябва да извикате publihProgress() вътре в doInBackground и след това да използвате onProgressUpdate, за да актуализирате своя TextView в UIThread.

person type-a1pha    schedule 12.07.2013
comment
Вашето предложение проработи и е точно това, което търсех. Благодаря ви много за обяснението, помогна ми да разбера по-добре поведението. :) - person luch0043; 14.07.2013