Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android Java-Textview在活动重新启动时不追加文本_Java_Android_Bluetooth_Handler_Thread Synchronization - Fatal编程技术网

android Java-Textview在活动重新启动时不追加文本

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

我一直在尝试在我的应用程序中创建一个包含在蓝牙RFID扫描仪中的功能,它与我的设备配对,我让它工作正常

我可以接收文本并将其记录在控制台中,当我编译活动时,一切都很顺利,棒读取代码,然后将文本附加到EditText中,但是如果我返回并再次输入活动,我可以在日志中看到代码,但文本不会进入EditText

我尝试了很多不同的方法,但似乎没有任何效果:/

以下是我的代码:

 /**
 * 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