Android 端末によっては、 AsyncTaskが二回呼ばれてしまう


Nexus 5 でプログラムを実行すると `AsyncTask` は一回しか呼ばれなかったのですが、今度は Xperia でプログラムを実行すると
`AsyncTask` が二回呼ばれてしまいました。端末が違えば挙動がおかしくなるというバグが `AsyncTask`
にはあったりするのでしょうか？以下にソースコードを記します。ログを取ってみると、 `PostTwitter` クラスの `doInBackground()`
と、 `TwitterOAuth` クラスの`getAccessToken()` の
`doInBackground()`がそれぞれ二回呼ばれていました。つまり Twitter への投稿が二回されてしまいます。これは `AsyncTask`
の使い方が何か間違っているのでしょうか？すみませんが、宜しくお願いします。

`PostTwitter` クラス:

[code]

    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());
        }
    }
    
[/code]

`TwitterOAuth` クラス:

[code]

    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);
        }
    }
    
[/code]




AsyncTaskはAPI 13からバッググラウンドでの処理が並列ではなくなっているので、

仮に、端末のOSのバージョンが違って

仮に、AsyncTaskの処理が同期されてない複数回呼ばれるものだったら

二回呼ばれることがあったり、なかったりするかもしれませんね。

