我有一个 MainActivity
, SecondaryActivity
和 AsyncTask
类。
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,因为您提到了主要活动或次要活动。致电活动。
我想您想根据SecondaryActivity
的AsyncTask
结果更新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给我这个解决方案。