我有一个带有以下图表的应用程序:
开始屏幕 - >控制屏幕< - >设置屏幕< - >消息屏幕
始终必须运行的工作线程是一个HTTP请求,它不断收集信息,因此它在开始屏幕启动。
“开始”屏幕跳转到“控制屏幕”。
即使我更改为“设置”或“控制屏幕”,也必须将工作线程中收集的信息传递到消息屏幕并全部显示。这是通过同时运行2个UI线程来在后台更新消息屏幕吗? (我首先介绍了什么应用程序,其中不断显示消息)
答案 0 :(得分:1)
通常只有1个UI线程。如果您希望有更长的运行任务(特别是如果您希望它们继续运行而不管UI),那么您应该使用服务。即使应用程序关闭,该服务也可以在后台运行。这样,您可以让一个类负责所有网络流量和数据收集,并且您的所有活动都可以绑定到该类。
答案 1 :(得分:1)
首先,只有一个UI Thread,它是运行应用程序的主线程,查看this answer将帮助您更好地理解android中的线程:
UIThread是应用程序的主要执行线程。 这是运行大多数应用程序代码的地方。您所有的 应用程序组件(活动,服务,ContentProviders, BroadcastReceivers)是在这个线程和任何系统调用中创建的 这些组件是在这个线程中执行的。
现在,您想要执行需要访问UI线程的操作(例如,在屏幕上显示某些内容,为视图设置动画,等等),因此,您有多个选项可以实现:
1 - 使用方法runOnUIThread()
:
此方法使用当前的Activity上下文或应用程序上下文来运行UI线程(主线程)中的包装代码,只需在运行活动中的任何位置使用其签名:
runOnUiThread(new Runnable() {
@Override
public void run() {
mInfo.setText(str);
}
});
甚至你可以通过在任何地方保存活动或应用程序上下文来从当前活动之外运行它,因此你甚至可以从正常的类中运行它:
MainActivity.mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
mInfo.setText(str);
}
});
2 - 使用AsyncTask
:
AsyncTask是在后台线程中执行后台工作的android方法,然后将结果应用于主线程(UI线程)。
您所要做的就是使用doInBackground()
提供的方法AsyncTask
为了处理必须在工作线程中完成的后台工作(比如在你的情况下处理HTTP请求),然后使用方法postExecute()
以便将结果反映到UI线程:
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// handle your worker thread work here
return "result";
}
@Override
protected void onPostExecute(String result) {
// update your UI here
}
}
看看here,让你的双手更好。