Пользовательский интерфейс не будет обновляться в режиме реального времени - PullRequest
0 голосов
/ 02 февраля 2012

Я пытаюсь измерить уровень сигнала Wi-Fi 5 раз (через каждую секунду) и отобразить его в TextView.Я одновременно пишу это и на внешнее хранилище. Все работает нормально, за исключением того, что я НЕ могу видеть результаты в режиме реального времени. Приложение будет работать в течение 5 секунд с пустым экраном, а затем отображать результаты (которые являются правильными, например, 5 разных показанийпосле каждой секунды).Я хотел бы видеть обновление результатов, как только новое значение будет вычислено в каждой итерации цикла for.Спасибо Вот код

public class WifiDemo extends Activity implements OnClickListener {
private static final String TAG = "WiFiDemo";
WifiManager wifi;
TextView textStatus;
Button buttonScan;

/** Called when the activity is first created. */
/*
 * (non-Javadoc)
 * 
 * @see android.app.Activity#onCreate(android.os.Bundle)
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Setup UI
    textStatus = (TextView) findViewById(R.id.textStatus);
    buttonScan = (Button) findViewById(R.id.buttonScan);
    buttonScan.setOnClickListener(this);

    // Setup WiFi
    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
            // Get WiFi status
            runOnUiThread(new Runnable() {
                public void run() {
                    try {
                    FileWriter fw = new FileWriter(
                            Environment.getExternalStorageDirectory()
                                    + "/bluetooth/wifi.txt");

                    for (int i = 0; i < 5; i++) {
                        WifiInfo info = wifi.getConnectionInfo();
                        Date d = new Date(System.currentTimeMillis());
                        String stat = "\n\nWiFi Status: " + info.getRssi()
                                + " " + d.getHours() + ":" + d.getMinutes()
                                + ":" + d.getSeconds();
                        textStatus.append(stat);
                        fw.write(stat);
                        fw.flush();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }


                    fw.close();

                }
                     catch (IOException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                            textStatus.append("something wrong");
                        }

            }
        });
    }
}
}

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Проблема в том, что вы делаете что-то правильно, пытаясь выполнить обновление в отдельном Runnable ... однако, ваш Runnable работает в потоке пользовательского интерфейса и поэтому заставляет поток пользовательского интерфейса сидеть в цикле (включая1001 *).Вы не получаете свои обновления, потому что заставляете пользовательский интерфейс ждать вас.

Если ваша обработка достаточно тяжелая, вы можете разбить ее на отдельный поток и отправить сообщения обработчику.В противном случае может быть проще всего сделать что-то вроде следующего (не проверено, но что-то похожее):

if (Environment.MEDIA_MOUNTED.equals(state)) {
    textStatus.postDelayed(new Runnable() {
        public void run() {
            WifiInfo info = wifi.getConnectionInfo();
            Date d = new Date(System.currentTimeMillis());
            String stat = "\n\nWiFi Status: " + info.getRssi()
                            + " " + d.getHours() + ":" + d.getMinutes()
                            + ":" + d.getSeconds();
            textStatus.append(stat);

            // relaunch if we're not through with our number of iterations.
            // mCount is a new field.
            if(mCount++ < 5) {
                textStatus.postDelayed(this, 1000);
            }
        }
    }, 1000);
}
1 голос
/ 02 февраля 2012

Вы можете попытаться создать обработчик для обработки задач обновления пользовательского интерфейса в основном потоке.Не обновляйте пользовательский интерфейс в своем потоке, вместо этого делайте это, передавая сообщения обработчика, чтобы убедиться, что это задание обрабатывается в основном потоке.Он отлично работает для меня.Я изменил часть вашего кода здесь (я удалил часть файла записи),

public class WifiDemo extends Activity implements OnClickListener {

private static final String TAG = "WiFiDemo";
private static final int WifiDetectStart = 0;
private static final int WifiDetectStop = 1;
private String stat;
WifiManager wifi;
TextView textStatus;
Button buttonScan;
Handler handler;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

 // Setup UI
    textStatus = (TextView) findViewById(R.id.textStatus);
    buttonScan = (Button) findViewById(R.id.buttonScan);
    buttonScan.setOnClickListener(this);

 //setup handler

    handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {

            if(msg.what == WifiDetectStart)
            {
                textStatus.append(stat);
            }

            if(msg.what == WifiDetectStop)
            {
                Thread.currentThread().interrupt();
            }

            super.handleMessage(msg);
        }  
       };

 // Setup WiFi
    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
            // Get WiFi status

            Thread myThread = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 5; i++) {
                        WifiInfo info = wifi.getConnectionInfo();
                        Date d = new Date(System.currentTimeMillis());
                        stat = "\n\nWiFi Status: " + info.getRssi()
                                + " " + d.getHours() + ":" + d.getMinutes()
                                + ":" + d.getSeconds();
                        Message msg = new Message();
                        msg.what = WifiDetectStart;
                        handler.sendMessage(msg);
//                      textStatus.append(stat);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }

                    //finish this operation
                    Message msg = new Message();
                    msg.what = WifiDetectStop;
                    handler.sendMessage(msg);
                }
        });
            myThread.start();
    }

}
...