如何从完全不同的包中的类访问 Android 活动 (findViewById),在不同的线程中运行



在我的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.
    }
}

您可以将视图或活动传递到此类中,并以 onProgressUpdateonPostExecute 进行更新。

有关参考检查 http://developer.android.com/reference/android/os/AsyncTask.html

最新更新