0

アプリでasyncTaskを使用していますが、onPostExecuteメソッドを呼び出していません。私はそれを何十回も読みましたが、エラーを見つけることができませんでした。

それは次のように流れます:

  1. 主な活動
  2. ->ユーザーがボタンをクリックします
  3. ->クラスを呼び出す
  4. ->いくつかのメッセージを表示するメソッドを使用して別のクラスを呼び出してから、AsyncTaskを実行します。

これは完全なクラスであり、AsyncTaskです。

package com.vdlow.socialnotification.twitter;

import java.util.ArrayList;

import com.vdlow.socialnotification.R;

import oauth.signpost.OAuth;
import twitter4j.IDs;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

public class TwitterUtils {
    static long userID;
    static Context c;
    static Boolean retornoSend;

    public static boolean isAuthenticated(SharedPreferences prefs) {

        String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
        String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

        AccessToken a = new AccessToken(token,secret);
        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);
        twitter.setOAuthAccessToken(a);

        try {
            twitter.getAccountSettings();
            return true;
        } catch (TwitterException e) {
            return false;
        }
    }

    public static void sendTweet(SharedPreferences prefs,String msg, Context cs) throws Exception {
        String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
        String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");
        String values[] = {token, secret, msg};
        TwitterUtils tu = new TwitterUtils();
        TweetSender ts = tu.new TweetSender();
        ts.execute(values);
        Log.i("retornoSend", retornoSend.toString());
        if(retornoSend){
            Toast.makeText(cs, cs.getString(R.string.tweet_sent), Toast.LENGTH_LONG).show();
        }
        else{
            Toast.makeText(cs, cs.getString(R.string.fail_sending), Toast.LENGTH_LONG).show();
        }
    }   

    public static ArrayList<String> getUserId(final SharedPreferences prefs) throws Exception{
        String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
        String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

        AccessToken a = new AccessToken(token,secret);
        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);
        twitter.setOAuthAccessToken(a);
        try {
            userID = twitter.getId();
        } catch (IllegalStateException e) {
            Log.e("Error! Method: getUserId() Class: TwitterUtils", e.toString());
        } 
        Log.i("USERID", String.valueOf(userID));
        ArrayList<String> following = new ArrayList<String>();
        long lCursor = -1;
        try{
            userID = twitter.getId();
            IDs friendsIDs = twitter.getFriendsIDs(userID, lCursor); 
            do
            {
                for (long i : friendsIDs.getIDs())
                {
                    following.add("@"+twitter.showUser(i).getScreenName());
                }
            }while(friendsIDs.hasNext());
        }
        catch(Exception e){
            Log.e("Exception! Class TwitterUtils Method: getFriendsName()", e.toString()+"\n User ID "+String.valueOf(userID));
        }
        return following;

    }

    private class TweetSender extends AsyncTask<String, Void, Boolean>{

        @Override
        protected Boolean doInBackground(String... msg) {
            Looper.prepare();
            String token = msg[0];
            String secret = msg[1];

            AccessToken a = new AccessToken(token,secret);
            Twitter twitter = new TwitterFactory().getInstance();
            twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);
            twitter.setOAuthAccessToken(a);
            try {
                twitter.updateStatus(msg[2]);
            } catch (TwitterException e) {
                Log.e("Error sending tweet Class TwitterUtils Method sendTweet() AsyncTask TweetSender", e.toString());
                return false;
            }           

            return true;
        }

        @Override
        protected void onPostExecute(Boolean result){
            Log.i("Post execute", "Runned");
            retornoSend = result;
        }
    }

それが機能しない理由はありますか?

4

1 に答える 1

0

あなたdoInBackgroundは決して完了していないか、ある時点でリクエストをキャンセルしています:

開発者ドキュメントから (以下の太字を参照): http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean )

このタスクの実行をキャンセルしようとします。タスクが既に完了している、キャンセルされている、またはその他の理由でキャンセルできなかった場合、この試行は失敗します。成功し、キャンセルが呼び出されたときにこのタスクが開始されていない場合、このタスクは決して実行されません。タスクがすでに開始されている場合、mayInterruptIfRunning パラメータは、タスクを停止するために、このタスクを実行しているスレッドを中断する必要があるかどうかを決定します。

このメソッドを呼び出すと、doInBackground(Object[]) が戻った後に UI スレッドで onCancelled(Object) が呼び出されます。このメソッドを呼び出すと、onPostExecute(Object) が呼び出されないことが保証されます。 このメソッドを呼び出した後、isCancelled() によって返される値を doInBackground(Object[]) から定期的にチェックして、できるだけ早くタスクを終了する必要があります。

于 2013-01-02T22:45:52.867 に答える