【问题标题】:How can I get a reference to the Activity that called a method?如何获得对调用方法的 Activity 的引用?
【发布时间】:2012-09-06 06:25:33
【问题描述】:

我有一个扩展 AsyncTask 以发送以太网消息的类。在我的 MainActivity 中创建和调用时,它可以正常工作:

new SendCommandTask(MainActivity.this).execute(ipAddress, portNum, message);

但是,我想将其嵌入到新类的方法中...

public class NewClass{

   String ipAddress;
   String portNum;
   String command;

   public NewClass(String ip, String pn, String, c){
      ipAddress = ip;
      portNum = pn;
      command = c;
   }
   public send(){
      SendCommandTask(MainActivity.this).execute(ipAddress, portNum, command);
   }
}

...并直接从我的 MainActivity 调用该方法:

NewClass newClass = new NewClass;    
NewClass.send();

我尝试将活动作为构造函数中的另一个参数传递,但是当我这样做时方法会呕吐。有没有另一种方法来引用我的 NewClass 中的调用活动?还是我卡在 MainActivity 中运行 AsyncTask? (我希望这是有道理的,总的来说,我对 Java 和 OO 编程非常陌生。)非常感谢任何帮助!

【问题讨论】:

  • 我同意 Sparky 的观点,您应该为此考虑 IntentService。否则,请在您说“但方法呕吐”时发布您所指的错误。
  • 另外,这里有更多关于活动和异步任务如何交互的信息:stackoverflow.com/questions/12117031/…

标签: android


【解决方案1】:

请参阅我几天前写的this answer。我认为这里也适用。主要的额外考虑因素是,您的AsyncTask 是否需要能够比其调用活动更长寿?如果 Activity 有可能关闭或重新启动,请在 onStop() 中终止任务或注意不要使用任何共享字段。

如果您的 AsyncTask 将直接读取作为您传入的 Activity 一部分的 任何 成员,您不妨将其保留在 Activity 中。当您希望它独立并能够与多个 Activity 类一起工作时,最好将任务分解为一个独立的类。

另外,请考虑在服务而不是活动中进行工作。我是IntentService 的忠实粉丝。

【讨论】:

  • 是的,听起来你应该使用 IntentService。
  • 我的应用程序中只有一个 Activity(无论如何现在),所以它肯定会比生命周期非常短的 AsyncTask 寿命更长。它只是通过 ip 发送一个字符串然后结束。听起来我最好将呼叫留在活动代码中。我肯定会探索切换到服务,但目前这有点过头了。一次一件事 :) 感谢您的帮助!
【解决方案2】:

您可以尝试在新类的构造函数中将之前的 Activity 作为上下文传递。

public NewClass(Context mainActivity, String ip, String pn, String, c)

它可能有效,但它似乎有点 hacky。

【讨论】:

  • SendCommandTask 需要一个 MainActivity 类型的参数,所以我仍然需要创建一个新的 MainActivity 对象来使用。他们如何将 Context 与 MainActivity 对象重新关联?不过,你是对的。无论哪种方式,这似乎都是一个不优雅的解决方案。
猜你喜欢
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多