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

Mou*_*usa 1 multithreading android cocoa-touch ui-thread

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

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

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

rfs*_*010 5

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

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

示例示例

  1. 处理程序示例

在此示例中,我们使用类"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();
}
}
Run Code Online (Sandbox Code Playgroud)

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

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