gpt4 book ai didi

java - WebView 膨胀太慢

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:35 26 4
gpt4 key购买 nike

我有以下代码:

public View onCreateView(LayoutInflater _inflater, ViewGroup _group, Bundle _savedInstanceState) {
Log.w(getClass().getName(), "start");
View view = _inflater.inflate(R.layout.myLayout, _group, false);
Log.w(getClass().getName(), "stop");
return view;
}

案例 1:

//myLayout.xml
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView 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"/>
</FrameLayout>

11:50:36.370 onCreateView: start
11:50:36.410 onCreateView: stop
Execution time: 40ms

然后我添加一个 WebView 并且不触及任何其他代码

案例 2:

//myLayout.xml
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView 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"/>
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>

11:51:16.645 onCreateView: start
11:51:16.985 onCreateView: stop
Execution time: 340ms

如您所见,两者之间存在巨大差异,我发现我的界面在第二种情况下滞后。
1) 这是有意为之的行为吗?
2) 如果是这样,我怎样才能消除 UI 中的滞后?
提前致谢
编辑:
第二种情况的完整日志:

11:51:16.645 onCreateView: start
11:51:16.710 I/WebViewFactory: Loading com.google.android.webview version 51.0.2704.81 (code 270408100)
11:51:16.740 W/art: Suspending all threads took: 11.333ms
11:51:16.755 I/cr_LibraryLoader: Time to load native libraries: 2 ms (timestamps 5137-5139)
11:51:16.755 I/cr_LibraryLoader: Expected native library version number "51.0.2704.81", actual native library version number "51.0.2704.81"
11:51:16.765 V/WebViewChromiumFactoryProvider: Binding Chromium to main looper Looper (main, tid 1) {1d66229a}
11:51:16.765 I/cr_LibraryLoader: Expected native library version number "51.0.2704.81", actual native library version number "51.0.2704.81"
11:51:16.765 I/chromium: [INFO:library_loader_hooks.cc(143)] Chromium logging enabled: level = 0, default verbosity = 0
11:51:16.795 I/cr_BrowserStartup: Initializing chromium process, singleProcess=true
11:51:16.805 E/ApkAssets: Error while loading asset assets/natives_blob_64.bin: java.io.FileNotFoundException: assets/natives_blob_64.bin
11:51:16.805 E/ApkAssets: Error while loading asset assets/snapshot_blob_64.bin: java.io.FileNotFoundException: assets/snapshot_blob_64.bin
11:51:16.870 W/cr_media: Requires BLUETOOTH permission
11:51:16.885 I/art: Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.WebViewContentsClientAdapter$WebResourceErrorImpl>
11:51:16.885 I/art: Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.WebViewContentsClientAdapter$WebResourceErrorImpl>
11:51:16.920 D/ConnectivityManager.CallbackHandler: CM callback handler got msg 524290
11:51:16.935 11557-11588/? W/FlurryAgent: Flurry session ended
11:51:16.945 I/art: Rejecting re-init on previously-failed class java.lang.Class<org.chromium.content.browser.FloatingWebActionModeCallback>
11:51:16.945 I/art: Rejecting re-init on previously-failed class java.lang.Class<org.chromium.content.browser.FloatingWebActionModeCallback>
11:51:16.970 D/cr_Ime: [InputMethodManagerWrapper.java:30] Constructor
11:51:16.980 W/cr_AwContents: onDetachedFromWindow called when already detached. Ignoring
11:51:16.980 D/cr_Ime: [InputMethodManagerWrapper.java:59] isActive: false
11:51:16.985 onCreateView: stop

最佳答案

不要使用 XML 创建它(设计)在后台线程中实用地创建它,并在页面加载时将其添加到布局中。

这里很好Example在相对布局中以编程方式创建它。

更新:

当我们在布局中添加任何小部件时,它的 dosent 意味着我们不会做任何事情,直到我们在我们的 java 代码中使用。

   <WebView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/webView"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />

当您在 XML 布局中编写以上代码时,setContentView() WebView 将使用其给定的属性执行。

WebView 是一个类,它将使用给定的属性集 执行其构造函数

 /**
* Constructs a new WebView with a Context object.
*
* @param context a Context object used to access application assets
*/
public WebView(Context context) {
this(context, null);
}

/**
* Constructs a new WebView with layout parameters.
*
* @param context a Context object used to access application assets
* @param attrs an AttributeSet passed to our parent
*/
public WebView(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.webViewStyle);
}

/**
* Constructs a new WebView with layout parameters and a default style.
*
* @param context a Context object used to access application assets
* @param attrs an AttributeSet passed to our parent
* @param defStyleAttr an attribute in the current theme that contains a
* reference to a style resource that supplies default values for
* the view. Can be 0 to not look for defaults.
*/
public WebView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}

/**
* Constructs a new WebView with layout parameters and a default style.
*
* @param context a Context object used to access application assets
* @param attrs an AttributeSet passed to our parent
* @param defStyleAttr an attribute in the current theme that contains a
* reference to a style resource that supplies default values for
* the view. Can be 0 to not look for defaults.
* @param defStyleRes a resource identifier of a style resource that
* supplies default values for the view, used only if
* defStyleAttr is 0 or can not be found in the theme. Can be 0
* to not look for defaults.
*/
public WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
this(context, attrs, defStyleAttr, defStyleRes, null, false);
}

/**
* Constructs a new WebView with layout parameters and a default style.
*
* @param context a Context object used to access application assets
* @param attrs an AttributeSet passed to our parent
* @param defStyleAttr an attribute in the current theme that contains a
* reference to a style resource that supplies default values for
* the view. Can be 0 to not look for defaults.
* @param privateBrowsing whether this WebView will be initialized in
* private mode
*
* @deprecated Private browsing is no longer supported directly via
* WebView and will be removed in a future release. Prefer using
* {@link WebSettings}, {@link WebViewDatabase}, {@link CookieManager}
* and {@link WebStorage} for fine-grained control of privacy data.
*/
@Deprecated
public WebView(Context context, AttributeSet attrs, int defStyleAttr,
boolean privateBrowsing) {
this(context, attrs, defStyleAttr, 0, null, privateBrowsing);
}

/**
* Constructs a new WebView with layout parameters, a default style and a set
* of custom Javscript interfaces to be added to this WebView at initialization
* time. This guarantees that these interfaces will be available when the JS
* context is initialized.
*
* @param context a Context object used to access application assets
* @param attrs an AttributeSet passed to our parent
* @param defStyleAttr an attribute in the current theme that contains a
* reference to a style resource that supplies default values for
* the view. Can be 0 to not look for defaults.
* @param javaScriptInterfaces a Map of interface names, as keys, and
* object implementing those interfaces, as
* values
* @param privateBrowsing whether this WebView will be initialized in
* private mode
* @hide This is used internally by dumprendertree, as it requires the javaScript interfaces to
* be added synchronously, before a subsequent loadUrl call takes effect.
*/
protected WebView(Context context, AttributeSet attrs, int defStyleAttr,
Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) {
this(context, attrs, defStyleAttr, 0, javaScriptInterfaces, privateBrowsing);
}

/**
* @hide
*/
@SuppressWarnings("deprecation") // for super() call into deprecated base class constructor.
protected WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes,
Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) {
super(context, attrs, defStyleAttr, defStyleRes);
if (context == null) {
throw new IllegalArgumentException("Invalid context argument");
}
sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
Build.VERSION_CODES.JELLY_BEAN_MR2;
checkThread();

ensureProviderCreated();
mProvider.init(javaScriptInterfaces, privateBrowsing);
// Post condition of creating a webview is the CookieSyncManager.getInstance() is allowed.
CookieSyncManager.setGetInstanceIsAllowed();
}

所有上述代码仍然通过仅在您的 xml 布局中添加 WebView 来执行。

这就是为什么它需要时间。

希望您能理解并在 WebView 类中添加断点并检查您的理解情况。

关于java - WebView 膨胀太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38519486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com