持续更新android Textview

持续更新android Textview,android,android-layout,textview,android-service,Android,Android Layout,Textview,Android Service,我正在开发一个Android应用程序,它有一个活动类和服务类。在服务中,每隔10毫秒将接收连续批量数据(1090字节)。我需要使用这些批量数据不断更新文本视图。从连续后台服务更新文本视图的推荐方法是什么 服务等级 public class RecepService extends Service { public static Handler mHandler; StringBuilder hexstring; @Override public IBinder onBind(Intent i

我正在开发一个Android应用程序,它有一个
活动
类和
服务
类。在
服务中
,每隔10毫秒将接收连续批量
数据(1090字节)
。我需要使用这些批量数据不断更新
文本视图
。从连续后台服务更新
文本视图
的推荐方法是什么

服务等级

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;
}
}
公共类RecepService扩展服务{
公共静态处理器;
字符串生成器;
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate(){
super.onCreate();
init();
}
私有void init(){
mHandler=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
如果(msg.what==0x123){
字节[]readBuf=(字节[])msg.obj;
int readBuflen=msg.arg1;
//这里将接收1090字节的数据
//每10毫秒
收到患者的礼物(readBuf、readBuflen);
}
}
};
}
公共无效接收患者属性(字节[]readBuf,整数){
字符串total_data=“”;
总数据=bytetohex(readBuf,len);
MainActivity.recep.setText(MainActivity.recep.getText().toString()+“\t”+
“”+总数据);
}
字符串bytetohex(字节[]txt,整数len){
字符串p=“”;
字节[]文本=新字节[len];
text=txt;
hexstring=新的StringBuilder();
对于(int j=0;j
您可以使用它不断更新您的文本视图

每次使用最新值运行服务时,在首选项中设置值

现在在计时器中,从首选项中获取该值,并用该值更新TextView

下面是一些代码:

class UpdateTimeTask extends TimerTask {
   public void run() {

   textview.setText("updated value");
   }
}
在onCreate()中设置


用户本地广播管理器

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);
}
主要活动

@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();
} 

如果您想使用时间表和计时器任务,那么您可以

要解决当前问题,请遵循以下说明。 假设您的活动具有广播接收器

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进行过滤,消息将使用此过滤器从服务中广播

现在,您的方法
receivePatientatAttributes
将如下所示:

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);

}

就这样。:)

使用处理程序,因为处理程序允许从其他后台线程与UI线程通信

boolean handlerStop = false;

    void handleHandler(){
        Handler handler =new Handler();
        final Runnable r = new Runnable() {
            public void run() {
                handler.postDelayed(this, 30000);
                if(!handlerStop) {
                    updateTextView() //update your text with other thread like asyncronous thread
                }
            }
        };
        handler.postDelayed(r, 0000);
    }

    @Override
    public void onResume() {
        super.onResume();
        handlerStop=false;
        handleHandler();
    }

    @Override
    public void onPause() {
        super.onPause();
        handlerStop=true;
        handleHandler();
    }

    @Override
    public void onStop() {
        super.onStop();
        handlerStop=true;
        handleHandler();
    }

但我的UI在一段时间后挂起,此时文本视图的更新值当然会被挂起。增加了您的持续时间。但我的UI在一段时间后挂起,而文本视图的更新值10毫秒太快。你应该考虑每隔1秒更新TeTVIEW。或者每次设置文本时,可以将新文本附加到现有文本。检查我的编辑。实际上数据接收部分来自ECG WIFI模块。所以我们不能减少时间。如果我减少丢失数据的时间。@Arya在(1000/10)个周期更新-->清除缓存和重做后,您可以在变量-->中本地缓存。阅读“绑定服务”模式
boolean handlerStop = false;

    void handleHandler(){
        Handler handler =new Handler();
        final Runnable r = new Runnable() {
            public void run() {
                handler.postDelayed(this, 30000);
                if(!handlerStop) {
                    updateTextView() //update your text with other thread like asyncronous thread
                }
            }
        };
        handler.postDelayed(r, 0000);
    }

    @Override
    public void onResume() {
        super.onResume();
        handlerStop=false;
        handleHandler();
    }

    @Override
    public void onPause() {
        super.onPause();
        handlerStop=true;
        handleHandler();
    }

    @Override
    public void onStop() {
        super.onStop();
        handlerStop=true;
        handleHandler();
    }