2013-01-02 159 views
0

我在我的应用程序中使用了asyncTask,但它没有调用onPostExecute方法。我读了十几遍,找不到错误。AsyncTask - onPostExecute永远不会被调用

它流动是这样的:

  1. MainActivity
  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; 
     } 
    } 

任何想法,为什么它不工作?

+0

doInBackground是否完成?如果在返回true之前放置日志,会发生什么情况?我的猜测是其中一个Twitter调用阻止了 – fedepaol

+1

TweetSender是'TwitterUtils'的嵌套类吗?如果是这样,给我们展示'TwitterUtils' ... –

+0

我把一个日志放在true之前并记录下来,所以它完成了执行。此外,推文正在发送,所以这是doInBackGround正在工作的另一个标志。我将使用TwitterUtils类更新帖子。 – vdlow

回答

0

doInBackground要么是从来没有完成,或取消在某些点要求:

从开发文档(见下文粗体文本):http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean

试图取消对此任务的执行。如果 任务已完成,已被取消或因其他原因不能取消 ,此尝试将失败。如果成功,并且此任务有 在调用取消时未启动,则此任务不应运行。如果 任务已经启动,则mayInterruptIfRunning参数 将确定执行此任务的线程是否应在尝试停止任务时中断 。

调用此方法将在doInBackground(Object [])返回后在UI线程上导致onCancelled(Object)被调用 。 调用 此方法保证不会调用onPostExecute(Object)。 调用此方法后,应尽早检查由doInBackground(Object [])定期返回的值 isCancelled()以尽早完成 任务。

相关问题