Я работаю над программой для Android, которая получает данные своего сенсора из отдельного класса (данные, которые я распечатываю в методе onSensorChange и отлично смотрятся). Нет, я хочу обновить свой пользовательский интерфейс с данными, которые у меня есть. Пользовательский интерфейс содержит некоторые текстовые изображения в действии (основное действие) в методе onCreate i инициализирует класс датчика, который получает данные датчика.Обновление пользовательского интерфейса автоматически
Я попытался использовать поток UIthread в методе onCreate, но текстовые просмотры не обновляются. У кого-нибудь есть право?
The OnCreate tlooks, как это (в отпечатков onSensorChange я получаю правильные данные):
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CompassHeading = (TextView) findViewById(R.id.CompassValue);
AccelValueZ = (TextView) findViewById(R.id.AccelValueZ);
AccelValueY = (TextView) findViewById(R.id.AccelValueY);
AccelValueX = (TextView) findViewById(R.id.AccelValueX);
GyroValue = (TextView) findViewById(R.id.GyroValue);
SensorM = new SensorModule(getApplicationContext()); //<<---Created instance of SensorModule
new Thread(new Runnable(){
//@Override
public void run(){
CompassHeading.setText("Heading: " + Float.toString(SensorM.AccelerationResult[0]) + " degrees");
AccelValueZ.setText(Float.toString(Math.round(SensorM.AccelerationResult[2])));
AccelValueY.setText(Float.toString(Math.round(SensorM.AccelerationResult[1])));
AccelValueX.setText(Float.toString(Math.round(SensorM.AccelerationResult[0])));
GyroValue.setText("Orientation X (Roll) :"+ Float.toString(Math.round(SensorM.AccelerationData[2])) +"\n"+
"Orientation Y (Pitch) :"+ Float.toString(Math.round(SensorM.AccelerationData[1])) +"\n"+
"Orientation Z (Yaw) :"+ Float.toString(Math.round(SensorM.AccelerationData[0])));
}
});
И в onSensorChange из SensorModule класса:
public void onSensorChanged(SensorEvent event) {
System.out.println("In onSensorChanged");
System.out.println("=====================");
// Get a local copy of the sensor values
System.arraycopy(event.values, 0, AccelerationData, 0, event.values.length);
AccelerationData[0] = AccelerationData[0]/SensorManager.GRAVITY_EARTH;
AccelerationData[1] = AccelerationData[1]/SensorManager.GRAVITY_EARTH;
AccelerationData[2] = AccelerationData[2]/SensorManager.GRAVITY_EARTH;
// Get result
AccelerationResult = GetAcceleration(AccelerationData);
System.out.println("Orientation X (Roll) :"+ Float.toString(Math.round(AccelerationData[2])) +"\n"+
"Orientation Y (Pitch) :"+ Float.toString(Math.round(AccelerationData[1])) +"\n"+
"Orientation Z (Yaw) :"+ Float.toString(Math.round(AccelerationData[0])));
System.out.println("Acceleration X :"+ Float.toString(Math.round(AccelerationResult[2])) +"\n"+
"Acceleration Y :"+ Float.toString(Math.round(AccelerationResult[1])) +"\n"+
"Acceleration Z :"+ Float.toString(Math.round(AccelerationResult[0])));
}
Update
Спасибо всем за ваши предложения! Я изменил основной код операции. Здесь я создаю поток, runnable object и обработчик. Теперь я получаю такие данные, но проблема в том, что я получаю иногда только новые данные, а не все поля обновляются. Правильно ли я реализовал поток и обработчик? Я хочу получить обновление как можно быстрее со всеми данными текущих полей. Кто-нибудь видит проблему в коде ниже? Все предложения приветствуются!
Ниже основной код вида деятельности:
package com.example.sensormodule;
import com.example.SensorModuleClass.SensorModule;
import com.example.sensormodule.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
public class MainActivity extends Activity{
TextView CompassHeading;
TextView AccelValueZ;
TextView AccelValueY;
TextView AccelValueX;
TextView GyroValue;
String value;
SensorModule SensorM;
// Need handler for callbacks to the UI thread
final Handler UpdateUIHandler = new Handler();
// Create runnable for posting
final Runnable UpdateResults = new Runnable() {
public void run() {
UpdateResultToUI();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CompassHeading = (TextView) findViewById(R.id.CompassValue);
AccelValueZ = (TextView) findViewById(R.id.AccelValueZ);
AccelValueY = (TextView) findViewById(R.id.AccelValueY);
AccelValueX = (TextView) findViewById(R.id.AccelValueX);
GyroValue = (TextView) findViewById(R.id.GyroValue);
SensorM = new SensorModule(getApplicationContext());
StartUpdateToUI();
}
@Override
protected void onResume() {
super.onResume();
}
protected void StartUpdateToUI() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
while(true){
//Keep updating the UI
UpdateUIHandler.post(UpdateResults);
}
}
};
t.start();
}
private void UpdateResultToUI() {
CompassHeading.setText("Heading: " + Float.toString(SensorM.AccelerationResult[0]) + " degrees");
AccelValueZ.setText(Float.toString(Math.round(SensorM.AccelerationResult[2])));
AccelValueY.setText(Float.toString(Math.round(SensorM.AccelerationResult[1])));
AccelValueX.setText(Float.toString(Math.round(SensorM.AccelerationResult[0])));
GyroValue.setText("Orientation X (Roll) :"+ Float.toString(Math.round(SensorM.AccelerationData[2])) +"\n"+
"Orientation Y (Pitch) :"+ Float.toString(Math.round(SensorM.AccelerationData[1])) +"\n"+
"Orientation Z (Yaw) :"+ Float.toString(Math.round(SensorM.AccelerationData[0])));
}
}
Теперь это хорошее место :-) –
@Emmanuel: Спасибо, что ответили! я следил за вашими субрингами и использовал обработчик! Но проблема, с которой я сталкиваюсь сейчас, это то, что я получаю только «Иногда данные». Не возражаете ли вы взглянуть? Я обновил свой код под обновлением – Roy08
Я решил его с помощью таймера и runonuithreat для обновления ui как можно скорее – Roy08