我试图在我的Android应用中添加Google Maps v2 API的法律声明,可以通过以下方式调用:GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo()
所以,我的代码如下:
String LicenseInfo = GooglePlayServicesUtil
.getOpenSourceSoftwareLicenseInfo(getApplicationContext());
AlertDialog.Builder LicenseDialog = new AlertDialog.Builder(MyActivity.this);
LicenseDialog.setTitle("Lagal Notices");
LicenseDialog.setMessage(LicenseInfo);
LicenseDialog.show();
但是当我执行这段代码时,系统需要大约10秒才显示对话框(考虑到我的设备是OnePlus One,看起来很奇怪)。
如果我尝试用简单(较短)的字符串替换LicenseInfo,则Dialog的打开速度非常快。所以我认为问题是从Google Play utils检索到的法律声明信息的长度。
我该如何解决这个问题?
答案 0 :(得分:3)
我遇到了同样的问题,但我在GitHub上发现了这个问题,并根据我的解决方案。这确实有帮助,但是当警告对话框显示时,UI线程上仍然有一个小挂起但只持续几秒钟。
private class AsyncLoadLicenseInfo extends AsyncTask<Void,Void,AlertDialog.Builder>
{
@Override
protected void onPreExecute()
{
progressDialog = new ProgressDialog(context);
progressDialog.setIndeterminate(true);
progressDialog.setMessage(context.getResources().getString(R.string.LegalNoticesLoading));
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected AlertDialog.Builder doInBackground(Void... params)
{
String googleAttribution = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(context);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder
.setTitle(context.getResources().getString(R.string.AboutLegalNotices))
.setCancelable(false)
.setMessage(googleAttribution)
.setPositiveButton(context.getResources().getString(R.string.Close),null);
return builder;
}
@Override
protected void onPostExecute(AlertDialog.Builder builder)
{
AlertDialog attributionDialog = builder.create();
attributionDialog.setOnShowListener(new DialogInterface.OnShowListener()
{
@Override
public void onShow(DialogInterface dialog)
{
progressDialog.dismiss();
progressDialog = null;
}
});
attributionDialog.show();
}
}
答案 1 :(得分:3)
正如tasmansiac建议的那样,使用WebView
代替TextView
可以毫无问题地工作 - 只会有一点延迟。
以下是显示对话框的完整代码:
private void legalDialog(){
String licenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this);
licenseInfo = licenseInfo.replace("\n", "<br/>");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.legal_notice);
WebView webView = new WebView(this);
webView.loadData("<html><body>"+licenseInfo+"</body></html>", "text/html", "utf-8");
WebSettings webSettings = webView.getSettings();
webSettings.setDefaultFontSize(12);
builder.setView(webView);
builder.setPositiveButton(R.string.dialog_close, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
final AlertDialog createDialog = builder.create();
createDialog.show();
}
在致电GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this)
之前,请务必检查null
是否未返回legalDialog()
。
答案 2 :(得分:1)
在运行Android 6的Motorola G5上,GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo()
(或最近GoogleApiAvailability.getInstance().getOpenSourceSoftwareLicenseInfo(getActivity())
)返回的许可证字符串长度超过600,000个字符。将字符串加载到TextView
时会发生延迟,必须在UI线程上完成。
LongStringLoader可能是解决此问题的方法。完全披露 - 我在开发团队工作。
答案 3 :(得分:1)
另一种解决方案是使用WebView
代替TextView
。
您可以拥有一个非常小的Html模板,并且可以使用
String result = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this);
答案 4 :(得分:0)
我无法显示进度对话框,因为用户界面冻结了。此外,耗时的部分是在dialog.show()发生时,并且无法在后台线程上完成。相反,我将法律声明链接的文本更改为“请稍候”,然后出现带有法律声明的对话框。当对话框被解除时,我将文本更改回“法律声明”(当然,新对话框占据了我的背景文本被覆盖的整个屏幕。如果没有,则使用dialog.setOnShowListener将文本更改为/从Please Wait)
legalNoticeTV.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
legalNoticeTV.setText(getResources().getString(R.string.please_wait));
legalNoticeTV.setEnabled(false);
String result = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this);
TextView tv = new TextView(this);
tv.setBackgroundColor(getResources().getColor(R.color.dialogbackgroundcolorgrey));
tv.setText(result);
tv.setPadding(8, 8, 8, 8);
ScrollView sc = new ScrollView(this);
sc.addView(tv);
legalNotice = new Dialog(this, R.style.DialogNoTitle);
legalNotice .requestWindowFeature(Window.FEATURE_NO_TITLE);
legalNotice.setContentView(sc);
legalNotice.show();
legalNotice.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
legalNoticeTV.setText(getResources().getString(R.string.legal_notices));
legalNoticeTV.setEnabled(true);
}
});
}
});
答案 5 :(得分:0)
在lenooh的答案中使用WebView时,最好使用TextUtils.htmlEncode(licenseInfo)
而不是手动将字符串转换为HTML字符串。
String licenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this);
licenseInfo = TextUtils.htmlEncode(licenseInfo);