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
overrideonActivityResult
中,当请求代码对应于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()上调用接口方法。这是一个很好的解决方案,我喜欢它。MydoSomething()
方法基本上刷新了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")