Обновление контента в WebView, проблемы с API от 16 и выше
Добавлено: 01 мар 2014, 12:54
Доброе время суток!
Помогите пожалуйста решить такую проблему, всю голову уже сломал.
В WebView загружается картинка с ip камеры (loadUrl).
По завершении загрузки (onPageFinished) вызывается handler (sendEmptyMessageDelayed), который опять загружает картинку с камеры (loadUrl), и так по кругу.
Чтобы изображение не кэшировалось, ставлю setCacheMode(WebSettings.LOAD_NO_CACHE)
Проверял на версиях API от 8 до 13, все отлично работает, изображения сменяются с заданным интервалом.
На API 15 возникла проблема: изображения сменяются, но не непрерывно, а с неприятной как бы задержкой.
То есть по завершении загрузки предыдущего изображения, оно пропадает, отображается белый (в моем случае) фон WebView, и только потом появляется следующее изображение.
Гугление быстро помогло решать проблему - нужно было либо отключить аппаратное ускорение в манифесте для всего activity (android:hardwareAccelerated="false"), либо только для нужного WebView - webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
Это помогло решить проблему, изображения опять пошли друг за другом без белого фона.
Но при тестировании на API 16 и 18 мерцание вернулось, между загрузками изображений опять интервал с белым фоном, и это "мерцание" очень раздражает.
Пробовал вместо подключения к камере загружать просто картинку из интернета, результат тот же.
Помогите пожалуйста решить проблему, буду очень благодарен.
Ниже привожу код, из которого выкинул все лишнее.
В нем присутствует подключение к публичной камере от производителя.
Помогите пожалуйста решить такую проблему, всю голову уже сломал.
В WebView загружается картинка с ip камеры (loadUrl).
По завершении загрузки (onPageFinished) вызывается handler (sendEmptyMessageDelayed), который опять загружает картинку с камеры (loadUrl), и так по кругу.
Чтобы изображение не кэшировалось, ставлю setCacheMode(WebSettings.LOAD_NO_CACHE)
Проверял на версиях API от 8 до 13, все отлично работает, изображения сменяются с заданным интервалом.
На API 15 возникла проблема: изображения сменяются, но не непрерывно, а с неприятной как бы задержкой.
То есть по завершении загрузки предыдущего изображения, оно пропадает, отображается белый (в моем случае) фон WebView, и только потом появляется следующее изображение.
Гугление быстро помогло решать проблему - нужно было либо отключить аппаратное ускорение в манифесте для всего activity (android:hardwareAccelerated="false"), либо только для нужного WebView - webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
Это помогло решить проблему, изображения опять пошли друг за другом без белого фона.
Но при тестировании на API 16 и 18 мерцание вернулось, между загрузками изображений опять интервал с белым фоном, и это "мерцание" очень раздражает.
Пробовал вместо подключения к камере загружать просто картинку из интернета, результат тот же.
Помогите пожалуйста решить проблему, буду очень благодарен.
Ниже привожу код, из которого выкинул все лишнее.
В нем присутствует подключение к публичной камере от производителя.
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<WebView
android:id="@+id/webViewCamera"
android:layout_width="fill_parent"
android:layout_height="match_parent" />
</LinearLayout>Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.webviewtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.webviewtest.MainActivity"
android:label="@string/app_name"
android:hardwareAccelerated="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>Код: Выделить всё
package com.example.webviewtest;
import java.lang.ref.WeakReference;
import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MainActivity extends Activity {
Handler h;
WebView webViewCamera;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webViewCamera = (WebView) findViewById(R.id.webViewCamera);
webViewCamera.getSettings().setLoadWithOverviewMode(true);
webViewCamera.getSettings().setUseWideViewPort(true);
webViewCamera.setInitialScale(0);
webViewCamera.setBackgroundColor(Color.TRANSPARENT);
webViewCamera.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webViewCamera.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
h = new MyHandler(this);
webViewCamera.loadUrl("http://50.197.211.181:9805/cgi-bin/CGIProxy.fcgi?usr=user&pwd=foscam&cmd=snapPicture2");
// webViewCamera.loadUrl("http://i53.fastpic.ru/big/2013/0315/88/97a2744b358c4593e50eb54fcc4bc888.jpg");
webViewCamera.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
h.sendEmptyMessageDelayed(0, 1000);
}
});
}
void getImage() {
webViewCamera.loadUrl("http://50.197.211.181:9805/cgi-bin/CGIProxy.fcgi?usr=user&pwd=foscam&cmd=snapPicture2");
// webViewCamera.loadUrl("http://i53.fastpic.ru/big/2013/0315/88/97a2744b358c4593e50eb54fcc4bc888.jpg");
}
static class MyHandler extends Handler {
WeakReference<MainActivity> wrActivity;
public MyHandler(MainActivity activity) {
wrActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity activity = wrActivity.get();
if (activity != null) {
activity.getImage();
}
}
}
}