2015-10-31 3 views
2

Я работаю над приложением для Android, которое имеет класс activity и класс service. В service, непрерывный объем data (1090 bytes) будет приниматься каждые 10 миллисекунд. Мне нужно постоянно обновлять данные text view этими объемными данными. Что рекомендуется для обновления Text view из непрерывной фоновой службы?Обновление андроидного текста непрерывно

Класс обслуживания

public class RecepService extends Service { 

public static Handler mHandler; 
StringBuilder hexstring; 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    init(); 
} 

private void init() { 

    mHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      if (msg.what == 0x123) { 

       byte[] readBuf = (byte[]) msg.obj; 
       int readBuflen = msg.arg1; 

       // here will receive 1090 bytes of data 
       // every 10 milliseconds 
       Receivepatientattributes(readBuf,readBuflen); 
      } 
     } 
    }; 
} 

public void Receivepatientattributes(byte[] readBuf, int len) { 

    String total_data = ""; 
    total_data = bytetohex(readBuf, len); 
    MainActivity.recep.setText(MainActivity.recep.getText().toString() + "\t" + 
      "" + total_data); 
} 

String bytetohex(byte[] txt, int len) { 

    String p=""; 
    byte[] text = new byte[len]; 
    text = txt; 

    hexstring = new StringBuilder(); 
    for (int j = 0; j < len; j++) { 

     String hex= Integer.toHexString(0xFF & txt[j]); 

     if (hex.length()==1) { 
      hexstring.append("0"); 
     } 

     hexstring.append(hex+" "); 

    } 

    p=p+hexstring.toString(); 
    return p; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    return START_STICKY; 
} 
} 
+0

читать о шаблоне «связанные услуги» – pskink

ответ

1

Если вы хотите использовать расписание и таймер задач, то вы можете See My Answer

Чтобы решить текущую проблему, следуйте приведенным ниже инструкциям. Пусть ваша деятельность имеет широковещательного приемник

private BroadcastReceiver mReceiver; 

Тогда вы переопределять методы onResume(), где будет зарегистрирован ваш вещательный приемник, а также onPause() где будет ваш приемник будет незарегистрированным:

@Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 

     IntentFilter intentFilter = new IntentFilter(
       "android.intent.action.MAIN"); 

     mReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       //extract your message from intent 
       String msg_for_me = intent.getStringExtra("YOUR_MESSAGE"); 
       //log your message value 
       Log.i("MyTag", msg_for_me); 

      } 
     }; 
     //registering your receiver 
     this.registerReceiver(mReceiver, intentFilter); 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     //unregister your receiver 
     this.unregisterReceiver(this.mReceiver); 
    } 

Здесь радиовещательный приемник фильтруется через android.intent.action.MAIN, а из Сервиса сообщение будет использоваться BroadCast

Теперь ваш метод Receivepatientattributes wil l нравится следующее:

public void Receivepatientattributes(byte[] readBuf, int len) { 

    String total_data = ""; 
    total_data = bytetohex(readBuf, len); 

    Intent i = new Intent("android.intent.action.MAIN").putExtra("YOUR_MESSAGE", total_data); 
    this.sendBroadcast(i); 

} 

Thats it. :)

0

Вы можете использовать Timer для Непрерывно обновления TextView.

Установите значение в настройках каждый раз, когда ваша служба работает с последним значением.

Теперь в Timer получите это значение из настроек и обновите TextView с этим значением.

Вот код:

class UpdateTimeTask extends TimerTask { 
    public void run() { 

    textview.setText("updated value"); 
    } 
} 

Набор в OnCreate();

Timer timer = new Timer(); 
    UpdateTimeTask UpdateTimeTask = new UpdateTimeTask(); 
    timer.schedule(UpdateTimeTask, 1000); 
+0

Но мой пользовательский интерфейс зависает после некоторого времени, когда значение обновления для текстового представления – Arya

+0

Конечно, это будет. увеличил продолжительность вашего времени. – KishuDroid

1

LocalBroadcastManager Пользователь

public void Receivepatientattributes(byte[] readBuf, int len) { 
    String total_data = ""; 
    total_data = bytetohex(readBuf, len); 

    Intent intent = new Intent("update-text"); 
    // add data 
    intent.putExtra("message", total_data); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 

В MainActivity

@Override 
public void onResume() { 
    super.onResume(); 

    // Register mMessageReceiver to receive messages. 
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, 
     new IntentFilter("update-text")); 
} 

private boolean mCanBeUpdated = true; 
private static final int ONE_SEC = 1000; //ms 
private static final int RECEPTION_SPEED = 10; //ms 
private static final int CYCLES = (int) (ONE_SEC/RECEPTION_SPEED); 
private int mCurrentCycle = -1; 
private String mMsgCache = ""; 

// handler for received Intents for the "update-text" event 
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Extract data included in the Intent 
     String message = intent.getStringExtra("message"); 
     Log.d("receiver", "Got message: " + message); 

     mMsgCache = mMsgCache + "\t" + message; 

     if (mCanBeUpdated) { 
      // No problem updating UI here, refer --> http://stackoverflow.com/a/5676888/1008278 
      final Handler handler = new Handler(context.getMainLooper()); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        MainActivity.recep.append(mMsgCache); 
        mMsgCache = ""; 
       } 
      }); 

      mCanBeUpdated = false; 
     } else if (mCurrentCycle >= CYCLES) { 
      mCurrentCycle = -1; 
      mCanBeUpdated = true; 
     } else { 
      mCurrentCycle++; 
     } 
    } 
}; 

@Override 
protected void onPause() { 
    // Unregister since the activity is not visible 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
    super.onPause(); 
} 

Reference

+0

Но мой пользовательский интерфейс зависает через некоторое время, пока значение обновления отображается в текстовом виде. – Arya

+0

10 миллисекунд слишком быстро. Вы должны рассмотреть возможность обновления текста через каждые 1 секунду. Или вместо того, чтобы устанавливать текст каждый раз, вы можете добавить новый текст в существующий текст. Проверьте мой EDIT. – VenomVendor

+0

Фактически часть приема данных находится от модуля ЭКГ WIFI. поэтому мы не можем сократить время. Если я уменьшу время, это потеряет данные. – Arya

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