我想不出一种方法来形成我的标题以使我的问题显而易见,所以这里是:
我第一次进入 AsyncTask 有点过头了。我目前有一个简单地发送推文的应用程序。要做到这一点,它必须踢出一个 WebView 来获得 Twitter 授权,这又回到了 onNewIntent()。
我要做的是在连接到站点/执行 AccessToken 工作时抛出一个简单的 Spinner ProgressDialog,然后在它发送推文时再次抛出。我刚刚发现进度条需要一个新线程。或者更确切地说,我应该在它自己的单独线程中做我的“时间密集型工作”,以使使用 ProgressDialog 可行。我的问题是:当我的授权代码在后台工作时,如何让我的进度微调器在前台,并最终打开 WebView 并返回,并最终在 onResume() 处重新开始一切?
我确定我可能没有以最适当的方式做其他所有事情。我是 Android 新手,但不是 Java 新手。我已经在程序上进行了关于它们应该在哪里的 create- 和 dismissDialog(int) 调用。照原样,一切都按照它应该的方式工作,但显然我的对话框根本无法显示自己。
我在想我应该基本上把我的整个 authorize() 和 tweet() 方法放到他们自己的 AsyncTask 中。我只是不知道该怎么做,特别是因为 authorize()(或更具体地说,loginToTwitter())需要在返回到 onNewIntent() 后最终将从浏览器获取的数据保存到共享首选项中。
感谢您的任何见解,== 马特
public class IntegrateTwitter extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
mPrefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
mTwitter = new TwitterFactory().getInstance();
mTwitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
if(authorize()) {
tweet();
returnToMM();
}
}
private boolean authorize() {
Log.i(LOG_TAG, "Authorizing...");
showDialog(PD_AUTHORIZING);
boolean result = false;
if(responseExistsAndValid()) {
saveResponseToAccessToken();
}
if(isAuthorized()) {
Log.i(LOG_TAG, "Prefs have AccessToken, grabbing it...");
if(getAccessTokenFromPrefs()) {
Toast.makeText(IntegrateTwitter.this, "Authorized.", Toast.LENGTH_SHORT).show();
result = true;
}
}
else {
Log.i(LOG_TAG, "Prefs don't have AccessToken.");
if(!responseStringExists()) {
Log.i(LOG_TAG, "No response exists either, starting Twitter login process...");
Toast.makeText(IntegrateTwitter.this, "Authorizing...", Toast.LENGTH_SHORT).show();
// Here is where it kicks out to the browser for authentication
loginToTwitter();
}
else {
Toast.makeText(IntegrateTwitter.this, "Authorization failed.", Toast.LENGTH_SHORT).show();
Log.i(LOG_TAG, "Response exists, so it must have failed once already, skipping Twitter login process.");
returnToMM();
}
}
deleteResponseFromPrefs();
dismissDialog(PD_AUTHORIZING);
return result;
}
private void tweet() {
showDialog(PD_TWEETING);
try {
Date testDate = new Date();
String testDateString = DateFormat.format("yyyy-MM-dd @ hh:mm:ss", testDate.getTime()).toString();
mTwitter.updateStatus(testDateString + " Test Tweet");
Toast.makeText(this, "Tweet successful!", Toast.LENGTH_SHORT).show();
}
catch (TwitterException e) {
Toast.makeText(this, "Tweet error.", Toast.LENGTH_SHORT).show();
Log.i(LOG_TAG, e.getMessage());
Log.i(LOG_TAG, Arrays.toString(e.getStackTrace()));
}
dismissDialog(PD_TWEETING);
}
// A bunch of support methods
// ...
}