在我的应用程序中实现Twitter集成时,我发现了Eclipse调试器的以下奇怪之处。造成这种情况的原因是什么?
我正在使用这个AsyncTask通过twitter4j 3.0.3从twitter获取请求令牌。
public class TwitterRequestAsync extends AsyncTask<Void, Void, RequestToken> {
private Context context;
public TwitterRequestAsync(Context context) {
this.context = context;
}
@Override
protected RequestToken doInBackground( Void... params ) {
Twitter twitter = getTwitter(); // getTwitter() is in enclosing class
try {
RequestToken token = twitter.getOAuthRequestToken();
return token;
}
catch (TwitterException e) {
Log.e( TAG, e.getMessage(), e );
return null;
}
}
@Override
protected void onPostExecute( RequestToken result ) {
super.onPostExecute( result );
if ( result != null ) {
// stuffs concerning request token here
}
}
}
当我调试此代码时,似乎在执行getOAuthRequestToken()时抛出了异常,并且调试器显示执行的下一行是在catch子句中,返回null;
但是,返回onPostExecute(...)的结果是一个有效的请求令牌,因此调试器正在做一些奇怪的事情。我已经多次清理了我的项目并重新启动了Eclipse,没有改变这种行为。我坏了吗?
答案 0 :(得分:1)
这是一个已知问题。看起来它可能是Dalvik VM的一个问题。显示该方法的最后一个return语句在调试器中执行。
将doInBackground正文更改为:
@Override
protected RequestToken doInBackground( Void... params ) {
Twitter twitter = getTwitter();
RequestToken token = null;
try {
token = twitter.getOAuthRequestToken();
}
catch (TwitterException e) {
Log.e( TAG, e.getMessage(), e );
}
return token;
}
导致执行似乎按预期进行。
请参阅https://groups.google.com/forum/?fromgroups=#!topic/android-developers/DEU6JmdyFyM以获取有关此问题的旧提及,并提供更老的提及链接。有人最终在https://code.google.com/p/android/issues/detail?id=34193创建了一个问题。
答案 1 :(得分:1)
正如您的自我回答所说,这是一个已知问题。我想指出它(以及其他怪癖)记录在Dalvik文档中。您可以在official but raw表单中找到它,或unofficial but formatted - 跳到“已知问题和限制”。
如果文档更加突出,那就太好了。