【问题标题】:Call a function in activity A from activity B with getInstance()使用 getInstance() 从活动 B 调用活动 A 中的函数
【发布时间】:2016-08-27 13:30:56
【问题描述】:

我有两个活动。我需要从活动 B 调用在活动 A 中创建的函数。 我第一次做的是: 在活动 A 中,我创建了我的函数:

public double [] getRSS(double [] queryC){

if (wifiList!=null){
    for (int i=0; i<wifiList.size(); i++){
    switch (wifiList.get(i).BSSID){ 
      case "56:2e:27:43:4b:f5" : queryC [0]= + wifiList.get(i).level ; break; 
      case "20:18:d8:4f:55:e8": queryC [1]  = + wifiList.get(i).level ; break; 
      case "7c:e9:d3:31:8f:b9": queryC [2] =  + wifiList.get(i).level ; break; 

    }
     }  
    }
return queryC;
}

在活动 B 中:

public class ActivityB extends  ActivityA{
.......
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activiteb);
.......
ActivityA w = new  ActivityA();
double [] query= w.getRSS(queryC);
.......
}
}

然后有时它会起作用,有时却不起作用! 我检查了这个答案Can i Create the object of a activity in other class?,我做了同样的事情:

static ActivityA ActivityA;

然后:

ActivityA = this; 
public static ActivityA getInstance() { return ActivityA; }

但我这里有错误说:

令牌“ActivityA”的语法错误,@预期 当我将第二节课改为:ActivityA.getInstance().getRSS(queryC); 我明白了: ActivityA 类型的方法 getInstance() 未定义

【问题讨论】:

  • 在您的应用程序类中编写此函数并使用您的应用程序实例进行访问。这将很容易实现您的目标。
  • 对不起,我很困惑!什么是应用类?
  • 好的,让我给你一小段代码,它将帮助你实现目标。

标签: java android function instance


【解决方案1】:

一个活动不应该引用另一个活动的实例。任何需要在两者之间传递的数据都应该通过用于启动第二个活动的 Intent 来完成,或者放入单例数据结构中。

【讨论】:

  • 有意图该怎么办?我在看Sending arrays with Intent.putExtra这是否意味着我不需要该功能?你能指导我使用意图吗?
  • 我尝试过,但 ActicityB 从未启动!
  • 请帮忙。谢谢
【解决方案2】:

不要走这条路!每个活动都会附加一个生命周期,手动创建它只会导致问题。存储活动本身的实例只会造成不应发生的泄漏。

尝试在与活动完全无关的类中实现getRSS(),可能使用getApplicationContext()。如有必要,将您需要的数据静态存储或通过其意图将其交给ActivityB

也不要为字段使用与ActivityA 类相同的名称。

【讨论】:

    【解决方案3】:
            public class YourApplication extends Application {
    
                private static YourApplication mInstance;
    
                @Override
                public void onCreate() {
                    super.onCreate();
                    mInstance = this;
    
    
                public static YourApplication getInstance() {
                    return mInstance;
                }
    
     public double [] getRSS(double [] queryC){
    
            if (wifiList!=null){
                for (int i=0; i<wifiList.size(); i++){
                    switch (wifiList.get(i).BSSID){
                        case "56:2e:27:43:4b:f5" : queryC [0]= + wifiList.get(i).level ; break;
                        case "20:18:d8:4f:55:e8": queryC [1]  = + wifiList.get(i).level ; break;
                        case "7c:e9:d3:31:8f:b9": queryC [2] =  + wifiList.get(i).level ; break;
    
                    }
                }
            }
            return queryC;
        }
    
    
            }
    

    在你的 ActivityA 类中,

    YourApplication.getInstance().getRSS(queryC)
    

    在您的 ActivityB 类中,您可以使用相同的方式访问。

    希望这会对你有所帮助。

    谢谢。

    【讨论】:

    • 如果您创建应用程序类,那么您还需要在清单文件中声明它。
    • 您最好使用YourApplication.getInstance(Context context),它将context.getApplicationContext() 转换为应用程序实例并避免静态引用。
    • 它并没有解决我的问题,但它帮助了我如何创建其他活动的实例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多