簡體   English   中英

從 class 訪問 TextView 實現 Runnable - Android Studio

[英]Accessing to TextView from class implementing Runnable - Android Studio

我有一個 class ExampleRunnable,它在某些限制下調用方法來更改值百分比和 TextView,它將在設置可見性一行之后顯示它。 我試圖顯示這個值,直到我不會停止這個線程。

我的應用程序凍結,因為我無法訪問 TextView。是否有任何解決方案,可以訪問對它們進行操作?

總機 class:

public class ScooterDashboard extends AppCompatActivity implements LocationListener {

   
    TextView textViewBatteryPercentage;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scooter_dashboard);

        
        textViewBatteryPercentage = findViewById(R.id.textViewBatteryPercentage);

        batBluetooth = findViewById(R.id.startBatteryMeasurement);


        batBluetooth.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                stopThread(view);
                return true;
            }
        });

        batBluetooth.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.R)
            @Override
            public void onClick(View view) {
                if(stopThread){
                    startThread(view);
                    textViewBatteryDistance.setText(Double.toString(batteryDistance));
                    textViewBatteryPercentage.setText(Double.toString(batteryPercentage));
                }
            }
        });

        
    }
...
public void startThread(View view) {
        stopThread = false;
        ExampleRunnable runnable = new ExampleRunnable();
        new Thread(runnable).start();

    }

    public void stopThread(View view) {
        stopThread = true;
    }



    class ExampleRunnable extends ScooterDashboard implements Runnable {
        @Override
        public void run() {
            while (!stopThread){
                
               //do while/try/catches...
                
                    ...
                    if(currentBatteryVoltage > 0 && batterySettingsDefined){
                        setTextBattery();    <- PROBLEM 
                    }
                //more try/catches...
            }
        }
    }

    private void setTextBattery() {
        setBatteryPercentage();
        ...
    }


    private void setBatteryPercentage() {
        double percentage = ((currentBatteryVoltage - bottomCutOffX) * 100) * (upperCutOffX - bottomCutOffX);

       
textViewBatteryPercentage.setText(Double.toString(batteryPercentage)); <- problem here
        textViewBatteryPercentage.setVisibility(View.VISIBLE); <- problem here
        
        if(percentage > 90){
            batBluetooth.setImageResource(R.drawable.bat100);
        }
        ...

        batteryPercentage = percentage; //not important, its value in ScooterDasboard, i omitted many in this code example
    }

}

runOnUiThread(()->{


textViewBatteryPercentage.setText(Double.toString(batteryPercentage));
 textViewBatteryPercentage.setVisibility(View.VISIBLE); 
})

用上面的代碼替換您設置的文本。Ui 組件無法在單獨的線程內訪問。UI 只能在 UI 線程內訪問。 如果您需要在單獨的線程中訪問 UI 組件,請使用上面的代碼。

如果您在片段中,請按以下方式使用

getActivity().runOnUiThread(()->{

//put your UI access code here

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM