2013-11-18 5 views
0

Я работаю над программой для 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]))); 
    } 
} 

ответ

2

Я вижу несколько проблем здесь:

1) Вы создаете новый Thread, но не вызывая его start(), так что Thread никогда не запускается.

2) Если вы называете start() вы получаете Exception говорят, что вы пытаетесь изменить интерфейс Thread из фона Thread.

Если вам необходимо обновить пользовательский интерфейс после некоторого фона Thread отделки следует использовать AsyncTask или Handler

+0

Теперь это хорошее место :-) –

+0

@Emmanuel: Спасибо, что ответили! я следил за вашими субрингами и использовал обработчик! Но проблема, с которой я сталкиваюсь сейчас, это то, что я получаю только «Иногда данные». Не возражаете ли вы взглянуть? Я обновил свой код под обновлением – Roy08

+0

Я решил его с помощью таймера и runonuithreat для обновления ui как можно скорее – Roy08

0

Как Emmanual предложил лучшие операции поточной сделаны с asyntask. но если вы хотите изменить ui в потоке, вы можете использовать parentActivity.runonuithread (runnable) {change}, это не лучший способ, но он работает или использует его с обработчиком.

+0

Спасибо за ваш ответ, я реализовал обработчик и поток, но я не получаю только данные «несколько раз» , Я обновил свой код под обновлением. Вы не против взглянуть? – Roy08

Смежные вопросы