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

时间:2011-11-22 13:42:43

标签: android multithreading cocoa-touch ui-thread

我已经从iOS应用程序开发转移到了android,所以我遇到了一些问题,找到了我之前使用过的一些函数。

在android中是否有类似[self performSelectorOnMainThread:@selector() withObject: waitUntilDone:];的函数可以从任何类的实例访问,知道该类不是从Activity类继承的。

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

2 个答案:

答案 0 :(得分:5)

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

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

示例示例

  1. 处理程序示例
  2. 在此示例中,我们使用“Handler”类在后台线程中更新ProgressBar。

    使用活动“ProgressTestActivity”创建一个新的Android项目“de.vogella.android.handler”。创建以下布局“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();
    }
    }
    

    运行您的应用程序。按下按钮后,ProgressBar将从后台线程更新。

    样本来自http://www.vogella.de/articles/AndroidPerformance/article.html#concurrency_handler

答案 1 :(得分:1)

任何类都可以访问Activity,只要您在该类中公开一些可以抓住当前ActivityContext的公共方法。例如:

    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对象当前Activity,您必须从Activity内将其传递给它。