android Java-Textview在活动重新启动时不追加文本
我一直在尝试在我的应用程序中创建一个包含在蓝牙RFID扫描仪中的功能,它与我的设备配对,我让它工作正常 我可以接收文本并将其记录在控制台中,当我编译活动时,一切都很顺利,棒读取代码,然后将文本附加到EditText中,但是如果我返回并再次输入活动,我可以在日志中看到代码,但文本不会进入EditText 我尝试了很多不同的方法,但似乎没有任何效果:/ 以下是我的代码:android Java-Textview在活动重新启动时不追加文本,java,android,bluetooth,handler,thread-synchronization,Java,Android,Bluetooth,Handler,Thread Synchronization,我一直在尝试在我的应用程序中创建一个包含在蓝牙RFID扫描仪中的功能,它与我的设备配对,我让它工作正常 我可以接收文本并将其记录在控制台中,当我编译活动时,一切都很顺利,棒读取代码,然后将文本附加到EditText中,但是如果我返回并再次输入活动,我可以在日志中看到代码,但文本不会进入EditText 我尝试了很多不同的方法,但似乎没有任何效果:/ 以下是我的代码: /** * Called when the activity is first created. */ @Override
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bluetooth);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> bondedSet = mBluetoothAdapter.getBondedDevices();
if (mBluetoothAdapter == null) {
Toast.makeText(this, "Bluetooth is not available.", Toast.LENGTH_LONG).show();
}
if (!mBluetoothAdapter.isEnabled()) {
Toast.makeText(this, "Please enable your BT and re-run this program.", Toast.LENGTH_LONG).show();
finish();
}
if (mBluetoothAdapter.isEnabled()) {
if(bondedSet.size() == 1){
for(BluetoothDevice device : bondedSet){
address = device.getAddress();
Log.d("bt:", address);
}
}
}
String address = "00:A0:96:2A:0A:1B";
out = (EditText) findViewById(R.id.output);
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
Log.d(TAG, device.getName() + " connected");
myConnection = new ConnectThread(device);
myConnection.start();
}
private class ConnectThread extends Thread {
private final BluetoothSocket mySocket;
Message msg;
public ConnectThread(BluetoothDevice device) {
BluetoothSocket tmp = null;
try {
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.d(TAG, "CONNECTION IN THREAD DIDNT WORK");
}
mySocket = tmp;
}
Handler uiThreadHandler = new Handler() {
public void handleMessage(Message msg) {
out = (EditText) findViewById(R.id.output);
Object o = msg.obj;
out.append(o.toString().trim());
Log.d("handler", o.toString());
}
};
public void run() {
out = (EditText) findViewById(R.id.output);
Log.d(TAG, "STARTING TO CONNECT THE SOCKET");
setName("My Connection Thread");
InputStream inStream = null;
boolean run = false;
mBluetoothAdapter.cancelDiscovery();
try {
mySocket.connect();
run = true;
} catch (IOException e) {
Log.d(TAG, this.getName() + ": CONN DIDNT WORK, Try closing socket");
try {
mySocket.close();
Log.d(TAG, this.getName() + ": CLOSED SOCKET");
} catch (IOException e1) {
Log.d(TAG, this.getName() + ": COULD CLOSE SOCKET", e1);
this.destroy();
}
run = false;
}
synchronized (BluetoothActivity.this) {
myConnection = null;
}
byte[] buffer = new byte[1024];
int bytes;
// handle Connection
try {
inStream = mySocket.getInputStream();
while (run) {
try {
bytes = inStream.read(buffer);
readMessage = new String(buffer, 0, bytes);
msg = uiThreadHandler.obtainMessage();
msg.obj = readMessage;
uiThreadHandler.sendMessage(msg);
Log.d(TAG, "Received: " + readMessage);
} catch (IOException e3) {
Log.d(TAG, "disconnected");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*在首次创建活动时调用。
*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.bluetooth);
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
Set-bondedSet=mBluetoothAdapter.getBondedDevices();
if(mBluetoothAdapter==null){
Toast.makeText(此“蓝牙不可用”,Toast.LENGTH_LONG.show();
}
如果(!mBluetoothAdapter.isEnabled()){
Toast.makeText(这是“请启用您的BT并重新运行此程序。”,Toast.LENGTH_LONG.show();
完成();
}
if(mBluetoothAdapter.isEnabled()){
if(bondedSet.size()==1){
用于(蓝牙设备:bondedSet){
address=device.getAddress();
日志d(“bt:,地址);
}
}
}
字符串地址=“00:A0:96:2A:0A:1B”;
out=(EditText)findViewById(R.id.output);
BluetoothDevice=mBluetoothAdapter.getRemoteDevice(地址);
Log.d(标记,设备.getName()+“已连接”);
myConnection=新连接线程(设备);
myConnection.start();
}
私有类ConnectThread扩展线程{
私人最终蓝牙插座mySocket;
消息消息;
公共连接线程(蓝牙设备){
BluetoothSocket tmp=null;
试一试{
tmp=device.createrFComSocketToServiceRecord(我的UUID);
}捕获(IOE异常){
Log.d(标记“线程中的连接未工作”);
}
mySocket=tmp;
}
Handler uiThreadHandler=新处理程序(){
公共无效handleMessage(消息消息消息){
out=(EditText)findViewById(R.id.output);
对象o=msg.obj;
out.append(o.toString().trim());
Log.d(“handler”,o.toString());
}
};
公开募捐{
out=(EditText)findViewById(R.id.output);
Log.d(标记“开始连接插座”);
setName(“我的连接线程”);
InputStream inStream=null;
布尔运行=假;
mBluetoothAdapter.cancelDiscovery();
试一试{
mySocket.connect();
run=true;
}捕获(IOE异常){
Log.d(标记,this.getName()+“:CONN不工作,请尝试关闭套接字”);
试一试{
mySocket.close();
Log.d(标记,this.getName()+“:CLOSED SOCKET”);
}捕获(IOE1异常){
Log.d(标记this.getName()+“:可以关闭套接字”,e1);
这个。销毁();
}
运行=错误;
}
已同步(BluetoothActivity.this){
myConnection=null;
}
字节[]缓冲区=新字节[1024];
整数字节;
//手柄连接
试一试{
inStream=mySocket.getInputStream();
while(运行){
试一试{
字节=流内读取(缓冲区);
readMessage=新字符串(缓冲区,0,字节);
msg=uiThreadHandler.obtainMessage();
msg.obj=readMessage;
uiThreadHandler.sendMessage(消息);
Log.d(标签“已接收:”+readMessage);
}捕获(IOE3异常){
日志d(标签“断开”);
}
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
我猜这与线程本身有关。当您第一次启动活动
时,还可以在线程
上调用.start()
问题是当您离开活动
并再次打开它时。在这种情况下,将调用onStop()
或onPause()
中的一个(取决于情况),然后分别调用onRestart()
或onResume()
诀窍现在就来了:在所有进程的同时,线程仍在运行。当您显示代码时,它没有停止/暂停,并且一直在运行。因此,基本上我的建议是,在活动的onCreate()
方法中有一些操作也应该在onPause()
和onStop()
事件中完成,我的另一个建议是在连接线程(Bluetooth设备)
方法中
要知道如何处理,我首先要在活动中定义onStop()
和onPause()
方法,并查看哪个被激发,记录每个属性以查看其值/状态,这样您就能够调试失败的部分
活动生命周期图。问题解决了,代码运行了,TextView获得了inputstream,问题是当我离开活动时,线程继续工作,到目前为止,一点问题都没有,在花了很多时间之后,我将TextView变成了一个静态变量,它工作了:)
如果有人读了这篇文章,我希望它能有所帮助。但是如果我返回并再次输入活动,我可以在日志中看到代码,但是文本不会进入编辑文本。
:你是说handleMessage
,所以显示了log.d
部分,但是.append()
没有显示出来吗?这就是ri