Runnable接口是Thread类的父类,run()是Runnable接口的方法。
因此,通常我们应该优先选择实现Runnable接口而不是继承Thread类,因为我们不想改变类的行为,也可以继承另一个类。这也有助于实现松耦合,并且我们可以从任何其他类更改用户界面。
我们可以通过4种方式更改UI:
1.使用Handler示例
public class MainActivity extends AppCompatActivity {
private Handler mainHandler=new Handler();
class ExampleRunnable implements Runnable {
int seconds;
public ExampleRunnable(int seconds) {
this.seconds = seconds;
}
@Override
public void run() {
for (int i = 0; i < seconds; i++) {
mainHandler.post(new Runnable() {
@Override
public void run() {
button.setText("50% process completed");
}
});
使用runOnUIThread()方法时,我们需要将其与post附加使用。可以通过以下示例轻松理解。
class ExampleRunnable implements Runnable {
int seconds;
public ExampleRunnable(int seconds) {
this.seconds = seconds;
}
@Override
public void run() {runOnUIThread.post(new Runnable() {
@Override
public void run() {
button.setText(" Runnable");
}
});
}
3. 通过使用任何视图,我们可以在此处使用任何视图进行调用,我使用了 switch 进行调用。
public class MainActivity extends AppCompatActivity {
private Switch aSwitch;
@Override
protected void onCreate(Bundle savedInstanceState) {
aSwitch=findViewById(R.id.switch1);
class ExampleRunnable implements Runnable {
int seconds;
public ExampleRunnable(int seconds) {
this.seconds = seconds;
}
@Override
public void run() { aSwitch.post(new Runnable() {
@Override
public void run() {
button.setText(" Runnable");
}
});
}
通过在另一个线程中创建Handler,我们需要定义Looper,因为默认情况下它会将我们附加到我们的线程looper。
Handler threadHandler=new Handler(Looper.getMainLooper());
threadHandler.post(new Runnable()
{
@Override
public void run() {
button.setText(" Runnable");
}
});
}
这是4种实现方式,我认为你现在可能对可运行线程和runOnUIThread()以及Handler有所了解,这些都是由其他人精美编写的。
Runnable
是因为它在调度运行的任务时提供了更多的灵活性。直接使用Thread
意味着你被限制在使用一种特定的策略上。 - chrylis -cautiouslyoptimistic-