💡Tips
- 🚀 采用预加载机制提升用户体验
- ⚠️ 注意处理生命周期防止内存泄漏
- 🔧 推荐使用标准化回调处理流程
// 建议使用全局 mMCAdInfo,mMCNativeAdView 和 mMCNativeAd
private MCAdInfo mMCAdInfo;
private MCNativeAdView mMCNativeAdView;
private MCNativeAd mMCNativeAd;
MCNativeAdLoader mNativeAdLoader = new MCNativeAdLoader(activity, "your placement id");
mNativeAdLoader.setNativeAdListener(new MCNativeAdListener() {
@Override
public void onAdLoaded(MCNativeAdView nativeAdView, MCAdInfo adInfo) {
// 加载成功回调
if (mMCNativeAd != null) {
mNativeAdLoader.destroy(mMCNativeAd);
}
mMCAdInfo = mcAdInfo;
mMCNativeAd = mcAdInfo.getNativeAd();
mMCNativeAdView = mcNativeAdView;
// 重置重试加载次数
retryAttempt = 0;
}
@Override
public void onAdLoadFailed(MCError mcError) {
// 加载失败回调
// 我们建议您按照指数递增的方式延长重试间隔,直到达到最大延迟时间(本例为 8 秒)或最大重试次数(本例为 3 次)
if (retryAttempt >= 3) return;
retryAttempt++;
long delayMillis = TimeUnit.SECONDS.toMillis((long) Math.pow(2, Math.min(3, retryAttempt)));
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mNativeAdLoader.loadAd();
}
}, delayMillis);
}
@Override
public void onAdDisplayed(MCAdInfo adInfo) {
// 展示成功回调
}
@Override
public void onAdHidden(MCAdInfo adInfo) {
// 广告关闭回调
}
@Override
public void onAdClicked(MCAdInfo adInfo) {
// 触发点击回调
}
});
mNativeAdLoader.setRevenueListener(new MCAdRevenueListener() {
@Override
public void onAdRevenuePaid(MCAdInfo adInfo) {
// 可在此回调获取广告收益
}
});
mNativeAdLoader.loadAd();
// NativeAdView的父容器
FrameLayout mNativeAdViewContainer = findViewById(R.id.adview_container);
mNativeAdViewContainer.removeAllViews();
if (mMCNativeAd != null) {
if (mMCNativeAd.isTemplateNativeAd()) {
// 模板渲染
mNativeAdViewContainer.addView(mMCNativeAdView);
} else {
//自渲染
mMCNativeAdView = createNativeAdView();
mNativeAdViewContainer.addView(mMCNativeAdView);
mNativeAdLoader.render(mMCNativeAdView, mMCAdInfo);
}
} else {
// 当前广告位没有可用缓存,建议重新加载
mNativeAdLoader.loadAd();
}
private MCNativeAdView createNativeAdView() {
// 自定义xml文件中各组件类型需和下列标识的保持一致
MCNativeAdViewBinder binder = new MCNativeAdViewBinder.Builder(R.layout.native_custom_ad_view)
// 可根据业务需要选择下面各组件进行设置渲染,建议添加下面所有组件
.setTitleTextViewId(R.id.title_text_view) //TextView
.setBodyTextViewId(R.id.body_text_view) //TextView
.setStarRatingContentViewGroupId(R.id.star_rating_view) //ViewGroup
.setAdvertiserTextViewId(R.id.advertiser_text_view) //TextView
.setIconImageViewId(R.id.icon_image_view) //ImageView
.setMediaContentViewGroupId(R.id.media_view_container) //ViewGroup
.setOptionsContentViewGroupId(R.id.options_view) //ViewGroup
.setCallToActionButtonId(R.id.cta_button) //Button
// .setWarningViewId(R.id.body_warn_view) (仅Yandex需要添加) //TextView
// .setSponserViewId(R.id.body_spon_view) (仅Yandex需要添加) //TextView
.build();
return new MCNativeAdView(binder, activity);
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="wrap_content"
android:maxHeight="300dp"
android:padding="8dp">
<ImageView
android:id="@+id/icon_image_view"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:background="#ff669900"
android:padding="2dp"
android:text="Ad"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="@+id/title_text_view"
app:layout_constraintStart_toEndOf="@+id/icon_image_view"
app:layout_constraintTop_toTopOf="@+id/title_text_view" />
<FrameLayout
android:id="@+id/options_view"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginBottom="8dp"
android:orientation="horizontal"
app:layout_constraintBottom_toTopOf="@+id/advertiser_text_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/title_text_view"
app:layout_constraintTop_toTopOf="@+id/icon_image_view" />
<TextView
android:id="@+id/title_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
app:layout_constraintStart_toEndOf="@+id/text_view"
app:layout_constraintTop_toTopOf="parent"
tools:text="Title" />
<TextView
android:id="@+id/advertiser_text_view"
android:layout_width="wrap_content"
android:layout_height="8dp"
android:layout_marginStart="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="@+id/icon_image_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/icon_image_view"
app:layout_constraintTop_toBottomOf="@+id/title_text_view"
app:layout_constraintVertical_bias="1.0"
tools:text="Advertiser" />
<FrameLayout
android:id="@+id/star_rating_view"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="4dp"
app:layout_constraintBottom_toTopOf="@id/advertiser_text_view"
app:layout_constraintStart_toStartOf="@id/text_view"
app:layout_constraintTop_toBottomOf="@id/text_view" />
<TextView
android:id="@+id/body_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/icon_image_view"
tools:text="Body" />
<FrameLayout
android:id="@+id/media_view_container"
android:layout_width="0dp"
android:layout_height="150dp"
android:layout_marginTop="4dp"
android:maxHeight="150dp"
app:layout_constraintDimensionRatio="W,16:9"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/body_text_view" />
<Button
android:id="@+id/cta_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:backgroundTint="#0583aa"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/media_view_container"
tools:layout_editor_absoluteX="8dp"
tools:text="Install" />
</androidx.constraintlayout.widget.ConstraintLayout>
if (mNativeAdLoader != null) {
mNativeAdLoader.destroy();
if (mMCNativeAd != null) {
mNativeAdLoader.destroy(mMCNativeAd);
}
}
MCNativeAdLoader mNativeAdLoader = new MCNativeAdLoader(activity, "your placement id");
Map<String, Object> loadExtraParameter = new HashMap<>();
loadExtraParameter.put("test_load_extra_key", "test_load_extra_value");
mNativeAdLoader.setLoadExtraParameter(loadExtraParameter);
Map<String, String> extraParameter = new HashMap<>();
extraParameter.put("test_extra_key", "test_extra_value");
mNativeAdLoader.setExtraParameter(extraParameter);
mNativeAdLoader.setNativeAdListener(new MCNativeAdListener() {
...
@Override
public void onAdLoaded(MCNativeAdView mcNativeAdView, MCAdInfo adInfo) {
// 获取自定义参数
adInfo.getOriginJsonString();
}
...
});
mNativeAdLoader.loadAd();