TextView未更新

时间:2018-04-03 07:41:02

标签: android multithreading textview android-runonuithread

我遇到了一个问题,我已经实现了一个代码,它正确地向我显示了Logs中的消息,但它并没有更新TextView的文本。在这里,我尝试过这个版本。我怎么更新它?我尝试使用线程但是徒劳无功。 我已经在这个StackOverflow平台上看到了很多解决方案,但我无法找到解决问题的任何解决方案。

 package com.example.yousafmoh.seizuredetection;

import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.AsyncTask;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;


public class ledControl extends AppCompatActivity {

    // Button btnOn, btnOff, btnDis;
    ImageButton On, Off, Discnt, Abt;
    TextView txtMessage;
    String address = null;
    private ProgressDialog progress;
    BluetoothAdapter myBluetooth = null;
    BluetoothSocket btSocket = null;
    private boolean isBtConnected = false;
    //SPP UUID. Look for it
    static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        Intent newint = getIntent();
        address = newint.getStringExtra(DeviceList.EXTRA_ADDRESS); //receive the address of the bluetooth device

        //view of the ledControl
        setContentView(R.layout.activity_led_control);

        //call the widgets
        On = (ImageButton)findViewById(R.id.on);
        Off = (ImageButton)findViewById(R.id.off);
        Discnt = (ImageButton)findViewById(R.id.discnt);
        Abt = (ImageButton)findViewById(R.id.abt);
        txtMessage = (TextView) findViewById(R.id.txtMessage);

        new ConnectBT().execute(); //Call the class to connect



        //myBluetoothThread();
        //commands to be sent to bluetooth

        On.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                turnOnLed();      //method to turn on
            }
        });

        Off.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                turnOffLed();   //method to turn off
            }
        });

        Discnt.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Disconnect(); //close connection
            }
        });


    }

    private void myBluetoothThread() {
        while(true)
        {
            if (btSocket!=null)
            {
                try
                {
                    if(isBtConnected) {
                        InputStream inputStream = btSocket.getInputStream();

                        for (int i = 0; i <= inputStream.available(); i++) {
                            //Log.d("data", inputStream.read() + " "+"ok");
                            int val = inputStream.read();
                            if (val == 49) // seizure detected
                            {
                                this.runOnUiThread(new Runnable() {

                                    @Override
                                    public void run() {
                                        txtMessage.setText("Seizure Detected!!!");
                                        txtMessage.setTextColor(getResources().getColor(android.R.color.holo_red_dark));
                                        Log.d("Message", " Detected");
                                    }
                                });

                                Log.d("Message", " Detected");

                            } else if (val == 48) // no detection
                            {
                                this.runOnUiThread(new Runnable() {

                                    @Override
                                    public void run() {
                                        txtMessage.setText("Normal Condition");
                                        txtMessage.setTextColor(getResources().getColor(android.R.color.holo_blue_dark));
                                        Log.d("Message", "not Detected");
                                    }
                                });

                                Log.d("Message", "not Detected");
                                //, Toast.LENGTH_SHORT).show();
                            }
                        }
                    }

                }
                catch (IOException e)
                {
                    msg("Error");
                }
            }
        }


    }


    private void Disconnect()
    {
        if (btSocket!=null) //If the btSocket is busy
        {
            try
            {
                btSocket.close(); //close connection
            }
            catch (IOException e)
            { msg("Error");}
        }
        finish(); //return to the first layout

    }

    private void turnOffLed()
    {
        if (btSocket!=null)
        {
            try
            {
                InputStream inputStream = btSocket.getInputStream();
                for(int i = 0 ; i <= inputStream.available();i++)
                {
                   Log.d("data",inputStream.read()+" ");
                }
                Log.d("Bytes available off",String.valueOf(inputStream.available()));
                Log.d("Message off",String.valueOf(inputStream.read()));
                //btSocket.getOutputStream().write("0".toString().getBytes());
            }
            catch (IOException e)
            {
                msg("Error");
            }
        }
    }

    private void turnOnLed()
    {
        if (btSocket!=null)
        {
            try
            {
                InputStream inputStream = btSocket.getInputStream();
                Log.d("Bytes available on",String.valueOf(inputStream.available()));
                Log.d("Message on",String.valueOf(inputStream.read()));
                Log.d("Message on",inputStream.toString());
                btSocket.getOutputStream().write("1".toString().getBytes());
            }
            catch (IOException e)
            {
                msg("Error");
            }
        }
    }

    // fast way to call Toast
    private void msg(String s)
    {
        Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
    }

    public  void about(View v)
    {
        if(v.getId() == R.id.abt)
        {
            Intent i = new Intent(this, AboutActivity.class);
            startActivity(i);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_led_control, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }



    private class ConnectBT extends AsyncTask<Void, Void, Void>  // UI thread
    {
        private boolean ConnectSuccess = true; //if it's here, it's almost connected

        @Override
        protected void onPreExecute()
        {
            progress = ProgressDialog.show(ledControl.this, "Connecting...", "Please wait!!!");  //show a progress dialog
        }

        @Override
        protected Void doInBackground(Void... devices) //while the progress dialog is shown, the connection is done in background
        {
            try
            {
                if (btSocket == null || !isBtConnected)
                {
                    myBluetooth = BluetoothAdapter.getDefaultAdapter();//get the mobile bluetooth device
                    BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);//connects to the device's address and checks if it's available
                    btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//create a RFCOMM (SPP) connection
                    BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
                    btSocket.connect();//start connection
                    progress.dismiss();
                }
            }
            catch (IOException e)
            {
                ConnectSuccess = false;//if the try failed, you can check the exception here
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine
        {
            super.onPostExecute(result);

            if (!ConnectSuccess)
            {
                msg("Connection Failed. Is it a SPP Bluetooth? Try again.");
                finish();
            }
            else
            {
                msg("Connected.");
                isBtConnected = true;

            }
            if(progress!=null)
            progress.dismiss();
            if(isBtConnected)
            {
                myBluetoothThread();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我在某处读过一些文章,你不应该直接在Runnable Thread中更新你的textview。所以我做的是创建了一个更新textview的函数,然后Runnable run方法调用该函数。所以它看起来像这样。

public class SampleActivity extends AppCompatActivity {
TextView sample;
int counter = 0;
Handler handler;
Runnable runnable;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sample);
    sample = findViewById(R.id.sample);
    handler = new Handler();
    runnable = new Runnable() {
        @Override
        public void run() {
            counter++;
            updateTextView("Counter: " + counter);
            handler.postDelayed(this, 1000);
        }
    };
    handler.postDelayed(runnable, 1000);
}

public void updateTextView(String message) {
    sample.setText(message);
}

但我尝试在Runnable Thread中调用sample.setText(“Counter:”+ counter),但它仍然有效。 顺便说一下这是我的sample.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

   <TextView
     android:id="@+id/sample"
     android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="SAWSAW"
    android:textColor="#000"
    android:textSize="32dp" />
</LinearLayout>

答案 1 :(得分:0)

如果是片段类

,请尝试使用它
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>typography</artifactId>
    <version>1.0.0</version>
    <scope>compile</scope>
</dependency>

这是一项活动

getActivity().runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    txtMessage.setText("Normal Condition");
                                    txtMessage.setTextColor(getResources().getColor(android.R.color.holo_blue_dark));
                                }
                            });

你可以尝试的另一个解决方案是。

您可以使用处理程序

this.runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    txtMessage.setText("Normal Condition");
                                    txtMessage.setTextColor(getResources().getColor(android.R.color.holo_blue_dark));
                                }
                            });