在我的Android应用程序中,我有一些代码在后台运行,在它自己的线程中。此代码与网络上的服务器联系以获取数据。获取数据后,我需要能够访问我的活动视图,以便我可以更改屏幕上的数据(图像、文本等)。以下是我的包的设置方式:
|- Java
| `- myMainPackage
| |- subPackage01
| | `- classIWantToAccessMyLayoutFrom.java // different thread
| |- subPackage02
| |- subPackage03
| `- subPackage04
| |- subSubPackageA
| | `- MainActivity.java
| |- subSubPackageB
| |- subSubPackageC
| | `- MyLayout.java
| `- subSubPackageD
|
`- res
|- drawable
|- layout
| |- activity_main.xml
| `- my_layout.xml
`- values
我只是无法弄清楚如何从classIWantToAccessMyLayoutFrom.java中访问活动。我是否在创建活动时将活动传递到构造函数中的 classIWantToAccessMyLayoutFrom.java,或者是否有更好、更"流畅"的方式来做到这一点?
如果我将其传递给线程的构造函数,我将不得不将活动传递到所有其他类,直到它到达需要它的实际类。似乎应该有更好的方法。有吗?
runOnUIThread( // set values or another runnable or whatnot here);
请在此处查看一个流行的答案:
如何使用 runOnUiThread
例:
private void runThread() {
new Thread() {
public void run() {
while (i++ < 1000) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
btn.setText("#" + i);
}
});
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
执行此操作的首选方法是使用 AsyncTask(假设活动在下载时间内不会被销毁),而不是创建单独的线程。
public class ClassIWantToAccessLayoutFrom extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
// Download content from URLs here.
}
protected void onProgressUpdate(Integer... progress) {
// This is run on the UI thread.
// Update any UI elements to report progress here.
}
protected void onPostExecute(Long result) {
// Your async task has completed.
// This runs on UI thread as well.
}
}
您可以将视图或活动传递到此类中,并以 onProgressUpdate
或 onPostExecute
进行更新。
有关参考检查 http://developer.android.com/reference/android/os/AsyncTask.html