Android 从AsyncTask调用不同的活动方法

Android 从AsyncTask调用不同的活动方法,android,android-asynctask,Android,Android Asynctask,我有一个main活动,secondary活动和一个异步任务类。 MainActivity有一个名为doSomething() 我从MainActivity调用AsyncTask,如下所示: new asyncTask(MainActivity.this).execute(); 这意味着我可以在我的onPostExecute @Override protected void onPostExecute(Boolean result){ super.onPostExecute(result

我有一个
main活动
secondary活动
和一个
异步任务
类。
MainActivity有一个名为
doSomething()

我从MainActivity调用AsyncTask,如下所示:

new asyncTask(MainActivity.this).execute();
这意味着我可以在我的
onPostExecute

@Override
protected void onPostExecute(Boolean result){
    super.onPostExecute(result);
    # activity is defined as this.activity
    activity.doSomething();       
}
我如何以类似的方式从SecondaryActivity调用AsyncTask,因为我需要对MainActivity的引用才能访问其方法

编辑:我希望始终调用
doSomething()
。因此,即使它来自SecondActivity,一旦它完成其后台操作->doSomething()


我调用的方法刷新MainActivity的屏幕以显示数据更改。辅助活动仅在AsyncTask暂停/停止/销毁时调用它,但当前AsyncTask在MainActivity启动后完成,因此更改不可见。

我认为您的AsyncTask当前嵌套在MainActivity中。你最好把它分门别类。无论它需要什么参数,都将其传递到构造函数中。让您的两个活动实现相同的接口。像这样的

class MainActivity/SecondaryActivity implements DoSomethingListener {
     void doSomething() {
     }
}
还将活动引用传递给构造函数中的AsyncTask


最后是onPostExecute,因为您有对MainActivity或Secondary Activity的引用。调用activity.doSomething。

在UpsertTask类中尝试此操作

private Context mContext;

public UpsertTask(Context context){
    mContext = context;
}

@Override
protected void onPostExecute(Object o) {
    super.onPostExecute(o);

    if(mContext instanceof MainActivity){
        ((MainActivity) mContext).doSomething();
    }
    else if(mContext instanceof SecondActivity){
        ((SecondActivity) mContext).doSomethingElse();
    }
}

我想那会管用的。(如果您正确理解了您的问题)。

我猜您想根据从
secondary activity
调用的
AsyncTask
的结果更新
main activity
中的内容。在这种情况下,我建议使用
startActivityForResult
调用
SecondaryActivity
。然后在您的
onPostExecute
中,调用
setResult
设置一个标志或一些数据


最后,在
MainActivity
override
onActivityResult
中,当请求代码对应于
SecondaryActivity
时,调用
doSomething
,因此您的需求是拥有一个MainActivity实例。MainActivity中的数据可以从MainActivity内部或从SecondaryActivity更新。在这两种情况下,要更新的数据都是使用AsyncTask获取的

我的建议

将以下内容添加到清单中的MainActivity(更多信息请参见此处)

当您完成与SecondaryActivity的交互时,请执行此操作

Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("DATA1", "your_data1");
    intent.putExtra("DATA2", "your_data2");
    startActivity(intent);
    finish();
然后在你的主要活动中

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    String data1 = intent.getStringExtra("DATA1");
    String data2 = intent.getStringExtra("DATA2");
}
然后使用data1和data2在MainActivity中调用AsyncTask

注意:这是解决问题的一种方法。根据您的需求,还有其他方法,如startActivityForResult()

更新 如果要取消AsyncTask,请调用
AsyncTask.cancel(true)

但是,这并不能确保HttpRequest被中止,因为取消将在请求完成后生效。这方面的工作有点草率。调用cancel()后,继续检查isCancelled()是否为true,然后执行
httpRequest.abort()
这将是完成异步任务的最快方法。不一定意味着请求被中止。

一种方法是使用事件总线。这是在活动之间传递消息/数据的一种方式。您可以发布到总线,然后活动可以在注册后侦听消息

事件总线类(单独)

main活动类

...
@Override
protected void onResume() {
    super.onResume();
    EventBus.getInstance().register(this);
}

@Override
protected void onPause() {
    super.onPause();
    EventBus.getInstance().unregister(this);
}

@Subscribe
public void asyncDone(String message) {
    foo(message)       
}
...
@Override
protected void onPostExecute(Boolean result){
    super.onPostExecute(result);
    EventBus.getInstance().post("My data")
异步任务类

...
@Override
protected void onResume() {
    super.onResume();
    EventBus.getInstance().register(this);
}

@Override
protected void onPause() {
    super.onPause();
    EventBus.getInstance().unregister(this);
}

@Subscribe
public void asyncDone(String message) {
    foo(message)       
}
...
@Override
protected void onPostExecute(Boolean result){
    super.onPostExecute(result);
    EventBus.getInstance().post("My data")

感谢Reddit的@theheartbreakpug为我提供了这个解决方案。

你的问题很难理解。我的假设是您有一个MainActivity、SecondaryActivity和一个UpsertTask类,它扩展了AsyncTask。现在,您希望在这两个活动中都使用UpsertTask,但根据调用方类调用不同的方法。我说得对吗???@Tony完全正确它是一个独立的类,不是嵌套的。然后,您只需要在两个活动中实现一个公共接口,并在postExecute()上调用接口方法。这是一个很好的解决方案,我喜欢它。My
doSomething()
方法基本上刷新了
MainActivity
的屏幕,因此无法在
SecondaryActivity
中声明它。谢谢您的回复。我想要的结果是始终使用onPostExecute调用
doSomething()
。我在示例中使用的null只是测试的一部分。因此,如果是第二个活动,我需要在某个时间获取主活动point@Lobstw这听起来是个非常糟糕的设计。您应该重新考虑。@ToOrkotov我调用的方法刷新mainactivity的屏幕以显示数据更改。辅助活动仅在AsyncTask暂停/停止/销毁时调用它,但当前AsyncTask在MainActivity启动后完成,因此更改不可见。哦!你的问题很令人困惑。那么,为什么不(1)将所需的数据从SecondaryActivity传递给MainActivity呢。(2) 在中完成辅助活动(3)调用AsyncAtaskMainActivity@Tony是否有一种方法可以将数据传递到MainActivity,而无需再次创建它?(这样就不用调用onCreate,而只需重新启动?)到目前为止,您的答案似乎最有希望。但是,我不能
setResult
,因为活动在postExecute时为空。我把它称为解决方案有点草率,对此表示抱歉。如果我在onPostExecute上执行setResult,则结果代码不会正确粘贴/设置,并且我的mainactivity看不到代码。我建议您在onPostExecute中执行activity.setResult,其中activity是SecondaryActivity的实例。稍后,当用户返回Main活动时,将执行doSomething。My activity是Secondary activity的实例,我在onPostExecute中设置result,但当调用onActivityResult时,结果代码为0。然后在
onPostExecute
中设置标志,调用
setResult
即可
...
@Override
protected void onPostExecute(Boolean result){
    super.onPostExecute(result);
    EventBus.getInstance().post("My data")