Android 端末によっては、 AsyncTaskが二回呼ばれてしまう
Nexus 5 でプログラムを実行すると AsyncTask
は一回しか呼ばれなかったのですが、今度は Xperia でプログラムを実行すると AsyncTask
が二回呼ばれてしまいました。端末が違えば挙動がおかしくなるというバグが AsyncTask
にはあったりするのでしょうか?以下にソースコードを記します。ログを取ってみると、 PostTwitter
クラスの doInBackground()
と、 TwitterOAuth
クラスのgetAccessToken()
の doInBackground()
がそれぞれ二回呼ばれていました。つまり Twitter への投稿が二回されてしまいます。これは AsyncTask
の使い方が何か間違っているのでしょうか?すみませんが、宜しくお願いします。
PostTwitter
クラス:
public class PostTwitter extends AsyncTask<String, Void, Boolean> {
private Activity mActivity;
private Twitter mTwitter;
public PostTwitter(Activity activity) {
mActivity = activity;
mTwitter = TwitterUtils.getTwitterInstance(activity.getApplicationContext());
}
public void shareTwitter() {
if (TwitterUtils.hasAccessToken(mActivity.getApplicationContext())) {
share(mActivity);
} else {
TwitterOAuth twitterOAuth = new TwitterOAuth(mActivity);
twitterOAuth.startAuthorize();
}
}
@Override
protected Boolean doInBackground(String... params) {
try {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/image.png");
StatusUpdate status = new StatusUpdate(params[0]); {
status.setMedia(file);
}
mTwitter.updateStatus(status);
return true;
} catch (TwitterException e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
if (result) {
showToast("ツイートが完了しました!");
} else {
showToast("ツイートに失敗しました。。。");
}
}
private void showToast(String text) {
Toast.makeText(mActivity, text, Toast.LENGTH_SHORT).show();
}
public void share(Activity activity) {
PostTwitter task = new PostTwitter(activity);
task.execute(TwitterContents.getInstance().getmMessage());
}
}
TwitterOAuth
クラス:
public class TwitterOAuth {
private Activity mActivity;
private String mCallbackURL;
private Twitter mTwitter;
private RequestToken mRequestToken;
private String mOAuthURL;
private String mOAuthVerifier;
public TwitterOAuth(Activity activity) {
mActivity = activity;
mCallbackURL = activity.getString(R.string.twitter_callback_url);
mTwitter = TwitterUtils.getTwitterInstance(activity);
}
public void startAuthorize() {
AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
try {
mRequestToken = mTwitter.getOAuthRequestToken(mCallbackURL);
mOAuthURL = mRequestToken.getAuthorizationURL();
return mOAuthURL;
} catch (TwitterException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String url) {
if (url != null) {
showTwitterDialog();
} else {
// 失敗。。。
}
}
};
task.execute();
}
private void getAccessToken() {
AsyncTask<String, Void, AccessToken> task = new AsyncTask<String, Void, AccessToken>() {
@Override
protected AccessToken doInBackground(String... params) {
try {
return mTwitter.getOAuthAccessToken(mRequestToken, params[0]);
} catch (TwitterException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(AccessToken accessToken) {
TwitterUtils.storeAccessToken(mActivity, accessToken);
PostTwitter postTwitter = new PostTwitter(mActivity);
postTwitter.share(mActivity);
}
};
task.execute(mOAuthVerifier);
}
}