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)。 调用此方法后,应定期从 doInBackground(Object[]) 中检查 isCancelled() 返回的值,以尽早完成任务。

于 2013-01-02T22:45:52.867 回答