Обновление контента в WebView, проблемы с API от 16 и выше

Интерфейс, диалоги, темы, стили, меню
Ответить
apollox
Сообщения: 23
Зарегистрирован: 07 янв 2014, 13:51

Обновление контента в WebView, проблемы с API от 16 и выше

Сообщение apollox » 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 мерцание вернулось, между загрузками изображений опять интервал с белым фоном, и это "мерцание" очень раздражает.
Пробовал вместо подключения к камере загружать просто картинку из интернета, результат тот же.

Помогите пожалуйста решить проблему, буду очень благодарен.

Ниже привожу код, из которого выкинул все лишнее.
В нем присутствует подключение к публичной камере от производителя.

Код: Выделить всё

<?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();

            }                                
		}
  	}
  	
  	
}

Ответить