您好我正在嘗試在AsyncTask中獲取Google Play服務廣告ID。
我閱讀Android AsyncTask API文檔和許多stackoverflow答案。我想首先獲得廣告ID,並開始其他流程。 因此,我製作了AdIdAsyncTask以獲取BackgroundThread中的廣告ID並在我的MainActivity中調用。但是我的AsyncTask狀態總是處於RUNNING狀態。 錯在哪裏?AsyncTask狀態始終在運行
MainActivity和AdIdAsyncTask
public class MainActivity extends Activity {
private static final String TAG = "DummyActivity";
private final long MEDIA_ID = 292929L;
private final String ACCESS_KEY = "xxxx-xxxx-xxxx";
private String adId = null;
private AdContext adContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AdIdAsyncTask task = new AdIdAsyncTask();
task.execute();
Log.d(TAG, "task.getStatus=" + task.getStatus());
if (task.getStatus().equals(AsyncTask.Status.FINISHED)) {
// do work
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
}
public class AdIdAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Log.d(TAG, "doInBackground");
AdvertisingIdClient.Info idInfo = null;
try {
idInfo = AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext());
} catch (GooglePlayServicesNotAvailableException | GooglePlayServicesRepairableException | IOException e) {
Log.e(TAG, "fetch Google Ads is failed. message=" + e.getMessage());
}
String advertisingId = null;
try {
advertisingId = idInfo.getId();
} catch (NullPointerException e) {
Log.e(TAG, "adId is null. message=" + e.getMessage());
}
adId = advertisingId;
cancel(true);
Log.i(TAG, "adId=" + advertisingId + ", isCancelled=" + isCancelled());
return null;
}
@Override
protected void onCancelled() {
super.onCancelled();
Log.i(TAG, "onCancelled");
}
@Override
protected void onCancelled(Void aVoid) {
super.onCancelled(aVoid);
Log.i(TAG, "onCancelled");
}
}
}
登錄
D/DummyActivity: task.getStatus=RUNNING
D/DummyActivity: doInBackground
I/DummyActivity: adId=xxxx-xxxx-xxxx, isCancelled=true
I/DummyActivity: onCancelled
I/DummyActivity: onCancelled
SdkVersion
compileSdkVersion 25
minSdkVersion 14
targetSdkVersion 25
_Async_意味着_asynchronous_。 'execute()'調用會立即返回,而'onCreate()'中的其餘代碼將繼續運行,而'AsyncTask'在單獨的線程上工作。 –
因此,如何修改我的代碼以獲取廣告ID並執行其他流程? – byrage
爲什麼你在onCreate()中檢查task.getStatus()。equals(AsyncTask.Status.FINISHED) ? 您剛剛在您的onCreate中啓動了AsyncTask,並且您正在立即檢查狀態,它與此無關 – Shaahul