ANR(应用无响应)问题在Android开发中是一个常见的问题,特别是在处理耗时操作时。下面是一个解决"Android ANR(应用无响应)BillingClient.queryPurchases"的示例代码:
implementation 'com.android.billingclient:billing:4.0.0'
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchasesResult;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private BillingClient billingClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
billingClient = BillingClient.newBuilder(this)
.enablePendingPurchases()
.setListener(purchases -> {
// 处理查询到的购买数据
handlePurchases(purchases.getResponseCode(), purchases.getPurchasesList());
})
.build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
// 异步查询购买数据
new QueryPurchasesTask().execute();
} else {
Log.e(TAG, "Billing setup failed: " + billingResult.getDebugMessage());
}
}
@Override
public void onBillingServiceDisconnected() {
// 断开连接时的处理逻辑
}
});
}
private void handlePurchases(int responseCode, List purchasesList) {
if (responseCode == BillingClient.BillingResponseCode.OK && purchasesList != null) {
// 处理购买数据
} else {
Log.e(TAG, "Error retrieving purchases: " + responseCode);
}
}
private class QueryPurchasesTask extends AsyncTask {
@Override
protected PurchasesResult doInBackground(Void... params) {
return billingClient.queryPurchases(BillingClient.SkuType.INAPP);
}
@Override
protected void onPostExecute(PurchasesResult result) {
super.onPostExecute(result);
handlePurchases(result.getResponseCode(), result.getPurchasesList());
}
}
}
通过将BillingClient.queryPurchases操作放在异步线程中执行,可以避免在主线程上执行耗时操作,从而避免ANR问题的发生。