UI 个线程与使用处理程序的其他线程之间的通信
Communication between UI thread and other threads using handler
UI线程与后台线程如何进行线程间通信?我想在这里使用通用处理程序概念来更新我的 UI。
我的概念如下
new Thread(new Runnable() {
public void run() {
while (mProgressStatus < 100) {
mProgressStatus = doWork();
// Update the progress bar
mHandler.post(new Runnable() {
public void run() {
mProgress.setProgress(mProgressStatus);
}
});
}
}
}).start();
我想使用两个 classes,一个 class 包含主线程,另一个 class 包含后台线程,它们使用相同的处理程序。我该如何实施?
我知道这很常见,但我发现很难准确实施。
如果您不想使用静态概念,则可以从参数传递任何内容。在下面的代码中,我实现了两个 classes。如您所问,我在两个线程 classes 中都使用了通用处理程序。我将处理程序 h1 作为 Runnable 对象的参数传递给那里的 start() 方法,以触发另一个线程 class 的 运行() 方法。包含 运行() 方法的线程是 UI(主)线程。我们必须使用 UI 线程来更新 UI。工作(后台)线程无法执行 UI 更新。 worker 与 UI 之间的通信是通过处理程序完成的。因此,我在 UI 线程 class 中定义了处理程序 h2。当从后台线程 class 调用 UI 线程 class 构造函数时,我从来自构造函数的 h1 获取 h2 值。我使用 h2 进行交流。实际上h2和h1在系统中属于同一个内存space。
我做了下面两个class并做了线程通信,供大家参考。
第一个class
public class MainActivity extends AppCompatActivity {
Handler h1;
Thread t;
EditText editText;
private Bundle bb = new Bundle();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
h1 = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
bb = msg.getData();
String str = bb.getString("udd");
editText.setText(str);
System.out.println(str);
}
};
t = new Thread(new MyRunnable(h1)); //I pass Runnable object in thread so that the code inside the run() method
//of Runnable object gets executed when I start my thread here. But the code executes in new thread
t.start(); //thread started
try {
t.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
第二个class
public class MyRunnable implements Runnable {
private Handler h2;
public MyRunnable(Handler h) {
this.h2 = h;
}
@Override
public void run() {
//everything inside rum method executes in new thread
for(int i=0;i<10;i++) {
Message m = Message.obtain(); //get null message
Bundle b = new Bundle();
b.putString("udd", "daju");
m.setData(b);
//use the handler to send message
h2.sendMessage(m);
}
}
}
注意:当thread.start()发生时,会触发Runnableclass的运行,它会创建一个单独的线程。因此,每次调用 start() 时,都会有一个与被调用线程具有相同优先级的新线程。
希望对您有所帮助。
UI线程与后台线程如何进行线程间通信?我想在这里使用通用处理程序概念来更新我的 UI。 我的概念如下
new Thread(new Runnable() {
public void run() {
while (mProgressStatus < 100) {
mProgressStatus = doWork();
// Update the progress bar
mHandler.post(new Runnable() {
public void run() {
mProgress.setProgress(mProgressStatus);
}
});
}
}
}).start();
我想使用两个 classes,一个 class 包含主线程,另一个 class 包含后台线程,它们使用相同的处理程序。我该如何实施? 我知道这很常见,但我发现很难准确实施。
如果您不想使用静态概念,则可以从参数传递任何内容。在下面的代码中,我实现了两个 classes。如您所问,我在两个线程 classes 中都使用了通用处理程序。我将处理程序 h1 作为 Runnable 对象的参数传递给那里的 start() 方法,以触发另一个线程 class 的 运行() 方法。包含 运行() 方法的线程是 UI(主)线程。我们必须使用 UI 线程来更新 UI。工作(后台)线程无法执行 UI 更新。 worker 与 UI 之间的通信是通过处理程序完成的。因此,我在 UI 线程 class 中定义了处理程序 h2。当从后台线程 class 调用 UI 线程 class 构造函数时,我从来自构造函数的 h1 获取 h2 值。我使用 h2 进行交流。实际上h2和h1在系统中属于同一个内存space。
我做了下面两个class并做了线程通信,供大家参考。
第一个class
public class MainActivity extends AppCompatActivity {
Handler h1;
Thread t;
EditText editText;
private Bundle bb = new Bundle();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
h1 = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
bb = msg.getData();
String str = bb.getString("udd");
editText.setText(str);
System.out.println(str);
}
};
t = new Thread(new MyRunnable(h1)); //I pass Runnable object in thread so that the code inside the run() method
//of Runnable object gets executed when I start my thread here. But the code executes in new thread
t.start(); //thread started
try {
t.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
第二个class
public class MyRunnable implements Runnable {
private Handler h2;
public MyRunnable(Handler h) {
this.h2 = h;
}
@Override
public void run() {
//everything inside rum method executes in new thread
for(int i=0;i<10;i++) {
Message m = Message.obtain(); //get null message
Bundle b = new Bundle();
b.putString("udd", "daju");
m.setData(b);
//use the handler to send message
h2.sendMessage(m);
}
}
}
注意:当thread.start()发生时,会触发Runnableclass的运行,它会创建一个单独的线程。因此,每次调用 start() 时,都会有一个与被调用线程具有相同优先级的新线程。
希望对您有所帮助。