从Asynctask调用不同的活动方法



我有一个 MainActivitySecondaryActivityAsyncTask类。
MainAttivity具有一种称为doSomething()

的方法

我从这样的主动行为称为异步:

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

这意味着我可以参考我的onPostExecute

中的主动脉
@Override
protected void onPostExecute(Boolean result){
    super.onPostExecute(result);
    # activity is defined as this.activity
    activity.doSomething();       
}

我如何以类似的方式从我的次级行动中调用异步性,因为我需要对我的主攻击来访问其方法?

编辑:我希望始终调用doSomething()。因此,即使是来自二极的,一旦完成其背景操作 -> dosomething()

我称之为的方法刷新了MainAttivity的屏幕以显示数据更改。次要活动仅在暂停/停止/销毁时调用异步性,但是当前在MainAttivity启动后的异步完成,因此不可见更改。

我认为您当前嵌套了您的异步。您将其放在单独的课程中更好。它所需的任何参数都将其传递在其构造函数中。让您的活动都实现相同的接口。像这样的东西

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

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

最终OnPostExecute,因为您提到了主要活动或次要活动。致电活动。

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

最后,在MainActivity中,当请求代码对应于SecondaryActivity时,onActivityResult覆盖CC_15。

,因此您的要求是具有一个主动效率。主要目的的数据可以从Main Activity内部或次级活动中更新。无论哪种情况,要更新的数据都是使用asynctask获得的。

我的建议

在清单中将以下内容添加到MainAttivity(更多关于Android:aunpentmode的信息。)

android:launchMode="singleInstance"

当您完成与次级活动相互作用时,请执行此操作,

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。

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

更新如果您想取消异步性,请致电asyncTask.cancel(true);但是,这将无法确保您的httprequest被中止,因为在请求完成后,取消将生效。解决的工作有点黑。调用CANCAL()后,contineally检查iscancelled()是否为true,然后执行httpRequest.abort()这只是完成异步任务的最快方法。不一定意味着该请求被中止。

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

我认为这会起作用。(如果您正确理解您的问题)。

这可以做到的一种方法是使用事件总线。这是一种在活动之间传递消息/数据的方式。您可以发布到公共汽车上,然后如果他们注册了消息。

eventbus类(分开)

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

MainActivity class

...
@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给我这个解决方案。

最新更新