我有MainActivity
,SecondaryActivity
和AsyncTask
类
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,但当前Assectask在MainActivity启动后完成,因此更改不可见。
答案 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为我提供了这个解决方案。