我尝试在Android中实现一个计时器,虽然它没有按预期完全正常工作。
我有以下代码用于计时器到期时(位于其自己的方法中):
Button b = (Button) this.findViewById(R.id.actionButton);
if(b != null && (!b.isEnabled() || b.getText().toString() == "Loading.."))
{
Toast.makeText(this, "Ad failed. Loading next ad...", Toast.LENGTH_SHORT).show();
SetupNextAdd(true); // The ad failed
}
该按钮是一个只显示广告的按钮,因此用户可以获得奖励。简单吧?
当广告在后台加载完成后,该按钮即可启用,以便在用户点击时为其准备好一些内容。
计时器是要仔细检查广告是否已加载。如果广告失败,我会知道,因为该按钮仍会被停用,或者文字仍会加载。
如果按钮已启用,我希望计时器完成其过程并且是免费的。
我认为这很简单。创建一个漂亮的计时器选中按钮,如果需要,重新加载广告。完成。
但问题是返回的按钮仍然表示文本正在加载并且已被禁用。我知道按钮并不是真的,因为我可以看到屏幕上的按钮既没有禁用也没有加载文本。那么为什么id会返回一个被禁用的按钮?它就像它在更改之前返回旧按钮一样。
这也会导致无限循环,因为返回的按钮状态永远不会与屏幕按钮状态匹配。
那么我怎样才能让计时器以我期望的方式工作?为什么它会返回旧按钮?
这是一个显示问题的完整示例。
查看:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/actionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="350dp"
android:background="@android:color/holo_blue_bright"
android:onClick="ShowAdd"
android:padding="5dp"
android:text="Loading..."
android:enabled="false"/>
<RelativeLayout
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
ads:adSize="BANNER"
ads:adUnitId="ca-app-pub-3940256099942544/6300978111">
</com.google.android.gms.ads.AdView>
</RelativeLayout>
</LinearLayout>
Java代码:
public class MainActivity extends AppCompatActivity {
private InterstitialAd mInterstitialAd;
private RewardedVideoAd mAd;
private AdView mAdView;
private CountDownTimer timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = new CountDownTimer(15000, 5000) {
@Override
public void onTick(long l) {
}
@Override
public void onFinish() {
TimerDone();
}
};
SetupNextAdd();
ShowBannerAd();
}
public void TimerDone()
{
Button b = (Button) findViewById(R.id.actionButton);
if(b != null && (!b.isEnabled() || b.getText().toString() == "Loading.."))
{
Toast.makeText(this, "Ad failed. Loading next ad...", Toast.LENGTH_SHORT).show();
SetupNextAdd(); // The ad failed
}
}
public void EnableDisableButton(String action)
{
MainActivity a = this;
Button b = (Button)a.findViewById(R.id.actionButton);
if(action == "enable")
{
b.setEnabled(true);
b.setText("View Ad");
timer.cancel();
}
else
{
b.setEnabled(false);
b.setText("Loading..");
}
}
public void ShowAdd(View view)
{
if(mAd.isLoaded()) {
mAd.show();
}
}
private void SetupNextAdd()
{
timer.cancel();
timer.start();
if(mAd == null) {
buildReward();
}
requestNewReward();
}
private void buildReward()
{
mAd = MobileAds.getRewardedVideoAdInstance(this);
mAd.setRewardedVideoAdListener(new RewardedVideoAdListener() {
@Override
public void onRewardedVideoAdLoaded() {
EnableDisableButton("enable");
}
@Override
public void onRewardedVideoAdOpened() {
}
@Override
public void onRewardedVideoStarted() {
}
@Override
public void onRewardedVideoAdClosed() {
EnableDisableButton("disable"); // disable till loaded. No reward for you
}
@Override
public void onRewarded(RewardItem rewardItem) {
EnableDisableButton("disable");
}
@Override
public void onRewardedVideoAdLeftApplication() {
}
@Override
public void onRewardedVideoAdFailedToLoad(int i) {
Toast.makeText(getApplicationContext(), "ad failed. Try again.", Toast.LENGTH_SHORT).show();
EnableDisableButton("disable");
SetupNextAdd();
}
});
}
private void requestNewReward()
{
mAd.loadAd("ca-app-pub-3940256099942544/5224354917", new AdRequest.Builder().build());
}
private void ShowBannerAd()
{
mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
}
}