Android 从非活动对象(如iOS中的([self-performSelectorOnMainThread])访问UI线程

Android 从非活动对象(如iOS中的([self-performSelectorOnMainThread])访问UI线程,android,multithreading,cocoa-touch,ui-thread,Android,Multithreading,Cocoa Touch,Ui Thread,我已经从iOS应用程序开发转移到android,所以我在寻找以前使用过的一些功能时遇到了一些问题 是否有类似于[self-performSelectorOnMainThread:@selector()的函数,其对象为:waitUntilDone:],知道该类不是从Activity类继承的 我发现有一个函数可以执行此操作,但我无法使用它,因为我需要从非活动对象调用它,所以是否有方法访问当前可见的活动,或者是否应该使用其他解决方案。如果没有活动对象,可以使用处理程序。类“Handler”可以更新UI

我已经从iOS应用程序开发转移到android,所以我在寻找以前使用过的一些功能时遇到了一些问题

是否有类似于
[self-performSelectorOnMainThread:@selector()的函数,其对象为:waitUntilDone:],知道该类不是从Activity类继承的


我发现有一个函数可以执行此操作,但我无法使用它,因为我需要从非活动对象调用它,所以是否有方法访问当前可见的活动,或者是否应该使用其他解决方案。

如果没有活动对象,可以使用处理程序。类“Handler”可以更新UI。句柄提供用于接收消息和可运行程序的方法。要使用处理程序,必须对其进行子类化,并重写handleMessage()以处理消息。要处理可运行文件,可以使用post()方法;您的活动中只需要一个处理程序实例

您可以通过sendMessage(Message msg)或sendEmptyMessage方法发布消息

示例

  • 处理程序示例
  • 在本例中,我们使用类“Handler”更新后台线程中的ProgressBar

    创建一个新的Android项目“de.vogella.Android.handler”,活动为“ProgressTestActivity”。创建以下布局“main.xml”。此布局包含ProgressBar,并通过样式设置其外观

    将您的活动更改为以下内容:

    package de.vogella.android.handler;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.widget.ProgressBar;
    
    public class ProgressTestActivity extends Activity {
    private Handler handler;
    private ProgressBar progress;
    
    
    /** Called when the activity is first created. */
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        progress = (ProgressBar) findViewById(R.id.progressBar1);
        handler = new Handler();
    }
    
    public void startProgress(View view) {
        // Do something long
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i <= 10; i++) {
                    final int value = i;
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            progress.setProgress(value);
                        }
                    });
                }
            }
        };
        new Thread(runnable).start();
    }
    }
    
    package de.vogella.android.handler;
    导入android.app.Activity;
    导入android.os.Bundle;
    导入android.os.Handler;
    导入android.view.view;
    导入android.widget.ProgressBar;
    公共类ProgressTestActivity扩展了活动{
    私人经办人;
    私人进度条进度;
    /**在首次创建活动时调用*/
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    进度=(ProgressBar)findViewById(R.id.progressBar1);
    handler=新的handler();
    }
    public void startProgress(视图){
    //做些长的事情
    Runnable Runnable=新的Runnable(){
    @凌驾
    公开募捐{
    
    对于(int i=0;i如果没有活动对象,可以使用处理程序。类“Handler”可以更新UI。句柄提供接收消息和可运行程序的方法。要使用处理程序,必须将其子类化并重写handleMessage()以处理消息。要处理可运行程序,可以使用方法post();在活动中只需要一个处理程序实例

    您可以通过sendMessage(Message msg)或sendEmptyMessage方法发布消息

    示例

  • 处理程序示例
  • 在本例中,我们使用类“Handler”更新后台线程中的ProgressBar

    创建一个新的Android项目“de.vogella.Android.handler”,活动为“ProgressTestActivity”。创建以下布局“main.xml”。此布局包含ProgressBar,并通过样式设置其外观

    将您的活动更改为以下内容:

    package de.vogella.android.handler;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.widget.ProgressBar;
    
    public class ProgressTestActivity extends Activity {
    private Handler handler;
    private ProgressBar progress;
    
    
    /** Called when the activity is first created. */
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        progress = (ProgressBar) findViewById(R.id.progressBar1);
        handler = new Handler();
    }
    
    public void startProgress(View view) {
        // Do something long
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i <= 10; i++) {
                    final int value = i;
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            progress.setProgress(value);
                        }
                    });
                }
            }
        };
        new Thread(runnable).start();
    }
    }
    
    package de.vogella.android.handler;
    导入android.app.Activity;
    导入android.os.Bundle;
    导入android.os.Handler;
    导入android.view.view;
    导入android.widget.ProgressBar;
    公共类ProgressTestActivity扩展了活动{
    私人经办人;
    私人进度条进度;
    /**在首次创建活动时调用*/
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    进度=(ProgressBar)findViewById(R.id.progressBar1);
    handler=新的handler();
    }
    public void startProgress(视图){
    //做些长的事情
    Runnable Runnable=新的Runnable(){
    @凌驾
    公开募捐{
    
    对于(int i=0;i任何类都可以访问
    活动
    ,只要您在该类中公开一些可以抓住当前
    活动
    上下文的公共方法。例如:

        public class SomeClass {
    
        public void launchActivity(Context context) {
           context.startActivity(new Intent(context, SomeOtherActivity.class));
        }
    
        public void showToast(Context context) {
           Toast.makeText(context, "check me out!", Toast.LENGHT_LONG).show();
        }
    
     }
    

    Java就像Objective-C一样,是一种面向对象的语言。问题是为了“给予”您的普通旧java对象是当前的
    活动
    ,您必须将它从该
    活动
    中传递给它,只要您在该类中公开一些可以抓住当前
    活动
    上下文
    的公共方法,任何类都可以访问该
    活动。例如:

        public class SomeClass {
    
        public void launchActivity(Context context) {
           context.startActivity(new Intent(context, SomeOtherActivity.class));
        }
    
        public void showToast(Context context) {
           Toast.makeText(context, "check me out!", Toast.LENGHT_LONG).show();
        }
    
     }
    
    它没有什么神奇之处。Java就像Objective-C一样是一种面向对象的语言。问题是,为了“给”普通的旧Java对象当前的
    活动
    ,您必须从该
    活动
    中将其传递给它