我在我的应用程序中使用了asyncTask,但它没有调用onPostExecute方法。我读了十几遍,找不到错误。AsyncTask - onPostExecute永远不会被调用
它流动是这样的:
- MainActivity
- - 按钮>用户点击
- - >调用类
- - >调用与该表现出一定的方法的另一类消息,然后执行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;
}
}
任何想法,为什么它不工作?
doInBackground是否完成?如果在返回true之前放置日志,会发生什么情况?我的猜测是其中一个Twitter调用阻止了 – fedepaol
TweetSender是'TwitterUtils'的嵌套类吗?如果是这样,给我们展示'TwitterUtils' ... –
我把一个日志放在true之前并记录下来,所以它完成了执行。此外,推文正在发送,所以这是doInBackGround正在工作的另一个标志。我将使用TwitterUtils类更新帖子。 – vdlow