Java 执行在同一活动的上一个实例中启动的AsyncTask的剩余任务
我正在使用Java 执行在同一活动的上一个实例中启动的AsyncTask的剩余任务,java,android,android-asynctask,android-activity,Java,Android,Android Asynctask,Android Activity,我正在使用AsyncTask在社交媒体上发布一些状态 private class PostOnSocialMedia extends AsyncTask<String, Void, String> { @Override protected void onPreExecute() { pDialog.setTitle(R.string.posting_status_on_social_media); Log.d(TAG, "onPr
AsyncTask
在社交媒体上发布一些状态
private class PostOnSocialMedia extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
pDialog.setTitle(R.string.posting_status_on_social_media);
Log.d(TAG, "onPreExecuteCalled.");
}
@Override
protected String doInBackground(String... params) {
Log.d(TAG, "doInBackground.");
currentActivity.this.twitter.tweet(params[0]);
currentActivity.this.facebook.post(params[0]);
currentActivity.this.googlePlus.share(params[0]);
return null;
}
@Override
protected void onPostExecute(String result) {
if (pDialog.isShowing()) {
pDialog.dismiss();
}
// Start next Activity when posted on all social media.
Intent intent = new Intent(currentActivity.this,
nextActivity.class);
intent.putExtra("userMatches", userMatches);
startActivity(intent);
Log.d(TAG, "onPostExecute.");
}
}
私有类PostOnSocialMedia扩展异步任务{
@凌驾
受保护的void onPreExecute(){
pDialog.setTitle(R.string.posting_status_on_social_media);
Log.d(标记为“onprexecutecalled”);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
Log.d(标签“doInBackground”);
currentActivity.this.twitter.tweet(参数[0]);
currentActivity.this.facebook.post(参数[0]);
currentActivity.this.googlePlus.share(参数[0]);
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
if(pDialog.isShowing()){
pDialog.disclose();
}
//在所有社交媒体上发布后开始下一个活动。
意向意向=新意向(currentActivity.this,
(触觉类);
intent.putExtra(“userMatches”,userMatches);
星触觉(意向);
Log.d(标记“onPostExecute”);
}
}
当用户未登录时,比如说,Twitter
我必须启动一个新的Intent
来显示Twitter页面(以便用户可以登录)。这会导致流返回到AsyncTask
,并调用onPostExecute()
方法。新的活动开始了
但我不想要这个。我想要的是,用户登录到Twitter
,然后它将返回到应用程序(当用户单击“登录流”时,它将返回到当前活动。但该活动是作为一个新活动创建的,而不是我开始调用social Media post时创建的活动)。当它返回到应用程序时,我调用Twitter
类的方法继续完成未完成的发布任务。一旦完成,我只想参加下一个活动
那么,有没有办法处理这种情况
编辑:使用
onSaveInstanceState(Bundle savedInstanceState)
和onRestoreInstanceState(Bundle savedInstanceState)
可以解决这个问题吗?在调用asynctask之前,请确保您的用户在两个平台上都已登录,然后调用asynctask,因为在这种情况下,用户可以进行多种组合,因此,我的建议是,首先确保用户同时登录facbook、tiwtter等。然后调用此asynctask,这样就不必让asynctask等待。一般来说,AsyncTasks是在后台执行任务,而不会阻塞UI线程。如果希望主线程(=UI线程)等待AsyncTask,则可以不使用AsyncTask来完成
AsyncTask used for background Process.
So you have to check All the condition before calling asynctask and then used.
如果您想等待,请尝试
yourTask.get()代码>,这将使主线程等待任务的结果。查找有关get()的更多信息。我通过使用静态
变量解决了我的问题,该变量在重新创建活动之前设置为true
,当活动
执行在onCreate
中时,我使用该变量来确定是否重新创建该活动,如果是,然后调用方法来执行剩余的任务
发帖完成后,我从成功完成发帖的Twitter
类调用一个活动方法,该方法调用一个在社交媒体上发帖的方法
活动中的方法:
public static void postDone() {
// Go to next activity
}
来自Twitter
class的呼叫:
MyActivity.postDone();
问题在于用户未登录的情况。如果用户已经登录,那么我就不需要显示Twitter页面,也没有问题。问题是当用户没有登录时。如果用户已登录,则我不需要显示Twitter页面,一点问题也没有。如果用户未登录,则放置一个警报框以指示该情况并强制用户登录,否则不要调用asyntask并不显示内容:9在UI
线程中不允许使用网络内容。因此,我必须使用AsyncTask
。问题是当用户登录时,会重新创建活动。因此,执行get()不起作用。为什么要重新创建活动?回到你的主要活动。(或者你开始一个不同的项目?你可以在你的主线程中这样做)这是通过Twitter完成的。显示Twitter页面的活动将作为返回应用程序的一部分重新创建。如果您想执行asynctask调用的结果,请在第一个asynctask的onPostExecute
中调用第二个asynctask,记住在这种情况下,第二个asynctask应将第一个asynctask的输出作为其输入。否则,结果调用没有任何意义。