1

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

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

我发现有一个函数runOnUiThread可以做到这一点,但我不能使用它,因为我需要从非活动对象调用它,所以有没有办法访问当前可见活动或者我应该使用其他解决方案.

4

2 回答 2

5

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

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

示例示例

  1. 处理程序示例

在此示例中,我们使用“处理程序”类在后台线程中更新 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

于 2011-11-22T13:48:55.833 回答
1

Activity只要您在该类中公开一些可以获取当前Activityor的公共方法,任何类都可以访问Context. 例如:

    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 对象 current Activity,你必须从 that 中将它传递给它Activity

于 2011-11-22T13:54:09.420 回答