Android 从非活动对象(如iOS中的([self-performSelectorOnMainThread])访问UI线程
我已经从iOS应用程序开发转移到android,所以我在寻找以前使用过的一些功能时遇到了一些问题 是否有类似于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
[self-performSelectorOnMainThread:@selector()的函数,其对象为:waitUntilDone:]可以从任何类的实例访问的android中的code>,知道该类不是从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对象当前的活动
,您必须从该活动
中将其传递给它