从AsyncTask调用不同的活动方法

时间:2016-06-19 19:50:36

标签: android android-asynctask

我有MainActivitySecondaryActivityAsyncTask类 MainActivity有一个名为doSomething()

的方法

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

new asyncTask(MainActivity.this).execute();

这意味着我可以在onPostExecute

中引用MainActivity
@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,但当前Assectask在MainActivity启动后完成,因此更改不可见。

6 个答案:

答案 0 :(得分:2)

我认为您的AsyncTask目前嵌套在MainActivity中。你把它放在单独的课堂上会更好。无论它需要什么参数,都要在它的构造函数中传递它。让您的活动实现相同的界面。像这样的东西

class MainActivity/SecondaryActivity implements DoSomethingListener {
     void doSomething() {
     }
}

还将您的活动引用传递给构造函数中的AsyncTask。

最后onPostExecute,因为您引用了MainActivity或Secondary Activity。致电activity.doSomething。

答案 1 :(得分:2)

我想你想根据MainActivity调用AsyncTask的结果更新SecondaryActivity中的内容。在这种情况下,我建议使用SecondaryActivity来调用startActivityForResult。然后在onPostExecute中,致电setResult以设置标记或某些数据。

最后,在MainActivity覆盖onActivityResult时,当请求代码对应doSomething时,调用SecondaryActivity

答案 2 :(得分:1)

所以你的要求是拥有一个MainActivity实例。 MainActivity中的数据可以从MainActivity或SecondaryActivity中更新。在任何一种情况下,使用AsyncTask获取要更新的数据。

我的建议

将以下内容添加到清单中的MainActivity中(此处有关android:launchMode的更多信息。)

android:launchMode="singleInstance"

完成与SecondaryActivity的交互后,请执行此操作,

Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("DATA1", "your_data1");
    intent.putExtra("DATA2", "your_data2");
    startActivity(intent);
    finish();

然后在您的MainActivity中

@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()这只是完成异步任务的最快方法。不一定意味着请求被中止。

答案 3 :(得分:0)

在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();
    }
}

答案 4 :(得分:0)

@Override
protected void onPostExecute(Boolean result){
    super.onPostExecute(result);
    # activity is defined as this.activity
    if (activity != null) {
       if(activity instanceof MainActivity) {
         activity.doSomething();
       } else if(activity instanceof SecondaryActivity) {
         activity.doSomethingElse();
       }
    }
}

我认为这样可行。 (如果你正确理解你的问题)。

答案 5 :(得分:0)

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

EventBus类(单独)

public class EventBus extends Bus {
    private static final EventBus bus  = new EventBus();   
    public static Bus getInstance() { return bus; }    
    private EventBus() {}
}

MainActivity类

...
@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)       
}

AsyncTask类

...
@Override
protected void onPostExecute(Boolean result){
    super.onPostExecute(result);
    EventBus.getInstance().post("My data")

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