我真的被困在这里,我已经阅读了很多关于Android的线程,但是我找不到适合我的项目的答案。
我有一个前端(管理GUI)和一个后端(管理数据和东西)。我需要在后端完成运行线程后立即更新GUI,但我无法弄清楚如何!
Main.java
包前端
public class Main extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread thread = new Thread() {
@Override
public void run() {
Server server = new Server(getApplicationContext());
}
};
thread.start();
Server.java
包后端
public static List<String> lista = new ArrayList<String>();
public Server(Context context) {
Revisar archivo = New Revisar();
archivo.DoSomething();
}
archivo.doSomething
完成后,我需要使用存储在静态列表中的后端数据更新GUI。
有什么建议吗?
答案 0 :(得分:0)
正如您所推测的那样,您无法从后台线程更新GUI。
通常,要执行所需操作,可以使用消息处理机制将消息传递给GUI线程。通常,您传递将在GUI线程中执行的Runnable。如果您已经为Message创建了子类,并添加了代码来处理消息,也可以传递Handler。
消息传递给处理程序。您可以在GUI线程中创建自己的Handler,也可以使用已存在的几个中的一个。例如,每个View对象都包含一个Handler。
或者您可以简单地使用runOnUiThread()活动方法。
模式1,处理程序加运行:
// Main thread
private Handler handler = new Handler();
...
// Some other thread
handler.post(new Runnable() {
public void run() {
Log.d(TAG, "this is being run in the main thread");
}
});
模式2,处理程序加消息:
// Main thread
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
Log.d(TAG, "dealing with message: " + msg.what);
}
};
...
// Some other thread
Message msg = handler.obtainMessage(what);
handler.sendMessage(msg);
模式3,调用runOnUiThread():
// Some other thread
runOnUiThread(new Runnable() { // Only available in Activity
public void run() {
// perform action in ui thread
}
});
模式4,将Runnable传递给View的内置处理程序:
// Some other thread
myView.post(new Runnable() {
public void run() {
// perform action in ui thread, presumably involving this view
}
});