অ্যান্ড্রয়েড ওয়েবভিউ স্লো


174

আমার android webviewsধীরে ধীরে। এটি ফোন থেকে 3.0+ট্যাবলেট পর্যন্ত পর্যাপ্ত চশমা ছাড়াও সমস্ত কিছুতে

আমি জানি যে ওয়েবভিউগুলি "সীমাবদ্ধ" বলে মনে করা হচ্ছে তবে আমি ফোনের ফাঁক দিয়ে ওয়েব অ্যাপ্লিকেশনগুলি দেখতে পেয়েছি যা অবশ্যই সমস্ত ধরণের CSS3এবং JQueryযাদুবিদ্যার ব্যবহার করা উচিত , সেগুলি ঠিকঠাক এবং দ্রুত চালিত হয় run

সুতরাং আমি কিছু মিস করছি, এমন কিছু আছে myWebview.SPEEDHACK(1)যা আমি জিনিসগুলি গতি বাড়ানোর জন্য ব্যবহার করতে পারি?

এছাড়াও, কখনও কখনও আমার ওয়েবভিউয়ের সামগ্রীগুলি ধীরে ধীরে লোড করার পরিবর্তে কেবল লোড হয় না, এটি কেবল লোড করবে না। আমি যে সম্পদটি পরীক্ষা করছি সেগুলি স্থানীয়ভাবে সংরক্ষণ করা হচ্ছে, কোনও ত্রুটি নেই।


3
মনে হচ্ছে আপনার কিছু কোড পোস্ট করা দরকার।
জেসোনিয়ার


1
@ কেনহাইট এই প্রশ্নটি বাদে আরও উত্তর রয়েছে, এই প্রশ্নের আরও ভাল এবং আরও বিস্তৃত উত্তর রয়েছে, এই প্রশ্নগুলির দ্বিগুণ মতামত রয়েছে, উভয় প্রশ্নই দুই বছরের বেশি পুরানো, এই দুটি প্রশ্নের প্রয়োগ এন্ড্রয়েডের সংস্করণ অপ্রচলিত ... কী? আপনি কি এই পতাকা থেকে বেরিয়ে আসছেন?
CQM

@ সিকিউএম: নীচে জর্জ মেসের সদৃশ জবাবের কারণে এই প্রশ্নটি সিস্টেম দ্বারা স্বয়ংক্রিয়ভাবে পতাকাঙ্কিত হয়েছিল। যদি তার উত্তরটি একাধিক পোস্টের উত্তর হিসাবে ভারব্যাটিম পুনরাবৃত্তি করতে পারে তবে তার মধ্যে একটির অপরটির সদৃশ। লিঙ্কযুক্ত প্রশ্ন পোস্টের তারিখের ভিত্তিতে পোস্ট করা হয়েছিল (এবং উত্তর দেওয়া হয়েছিল)। একটি সদৃশ একটি নকল, এবং প্রথম পোস্টটি আসল ছিল (এবং উত্তরগুলি আগেও ছিল)। আমি এটি চিহ্নিত করার বাইরে কিছুই পাই না (এবং এটি প্রথম স্থানে ছিল না)।
কেন হোয়াইট

1
এছাড়াও, আপনার অ্যাপ্লিকেশনগুলিতে ক্লিক ইভেন্টটি ব্যবহার করবেন না, এটি ক্লিক ক্লিক করার জন্য, প্রতিটি ক্লিকে প্রতিক্রিয়া জানাতে 300ms বিলম্ব যুক্ত করে। পরিবর্তে টাচস্টার্ট ব্যবহার করা আরও ভাল। আমি একটি ক্লিকহ্যান্ডার তৈরি করেছি যা দুটি ইভেন্ট ব্যবহার করে এবং প্রথম ট্রিগার হওয়া ইভেন্টটি গ্রহণ করে। আমি 'টাচস্টার্ট ক্লিক' ব্যবহার করি, তাই এটি এখনও টাচস্ক্রিন ছাড়াই কাজ করে।
কোডবিট

উত্তর:


132

এটি ওয়েব অ্যাপ্লিকেশন লোড হচ্ছে তার উপর নির্ভর করে। নীচের কয়েকটি পদ্ধতির চেষ্টা করুন:

উচ্চতর রেন্ডার অগ্রাধিকার সেট করুন (API 18+ থেকে অবমূল্যায়ন):

webview.getSettings().setRenderPriority(RenderPriority.HIGH);

হার্ডওয়্যার ত্বরণ সক্ষম / অক্ষম করুন:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    // chromium, enable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    // older android version, disable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

ক্যাশে অক্ষম করুন (যদি আপনার সামগ্রীতে সমস্যা থাকে):

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

46
আমি বুঝতে পারি যে কেন রেন্ডার অগ্রাধিকার সেট উচ্চতর করা তা দ্রুততর করে তুলবে। তবে কেন ক্যাশে বন্ধ?
ডিমাস কোটভান

39
সেটারেডারপ্রিয়টিটি পদ্ধতিটি হ্রাস করা হয়েছে, দেখুন ডেভেলপার.অ্যান্ড্রয়েড
ভিক্টর আইনেস্কু

6
সেটরেন্ডারপ্রাইরিটির জন্য সঠিক লিঙ্কটি এখানে রয়েছে
ক্রিস্টোফার পেরি

2
আমি আমার অ্যাপটিতে এই কোডটি কোথায় রাখব? দয়া করে সহায়তা করুন - মিশনের সমালোচনামূলক ওয়েবভিউতে আমার একই সমস্যা আছে
লেভিক ২১

6
কেন আপনি ক্যাশে বন্ধ করেন?
হাসি 31

52

এই যোগ করার পদ্ধতি android:hardwareAccelerated="true"ম্যানিফেস্টে ছিল একমাত্র জিনিস উল্লেখযোগ্যভাবে আমার জন্য কর্মক্ষমতা উন্নত

এখানে আরও তথ্য: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel


1
এটি কেবলমাত্র API v11 / Android 3.x এবং উচ্চতর
লুডো

6
যত্ন নিন, একটি খোলা বাগ সংশ্লিষ্ট হার্ডওয়্যার ত্বরিত WebViews, যেমন প্রশ্ন বিবৃত এর stackoverflow.com/q/17059899/225341
ভিক্টর Ionescu

1
আমি লক্ষ্য করেছি যে হার্ডওয়্যার ত্বরণ বন্ধ করা আসলে আমার অ্যাপ্লিকেশনটিকে আরও দ্রুত করে তোলে। সঙ্গে android:hardwareAccelerated="true"CSS এর 3D অ্যানিমেশন আগে তারা শুরু দীর্ঘ বিলম্বের ছিল, divs স্ক্রোলিং ভিতরে অন্যান্য স্ক্রোলযোগ্য divs কাজ করে নি, এবং অ্যাপ্লিকেশান আরো অস্থির ছিল।
এরনেস্টস কার্লসন

1
ডিফল্ট মানটি "সত্য" তবে যদি আপনি minSdkVersion বা लक्ष्यSdkVersion "14" বা তার চেয়ে বেশি সেট করে থাকেন;
বিহান ভার্মা

37

আমাদের জন্য সমাধানটি ছিল বিপরীত। আমরা এই কোডটি ব্যবহার করে কেবল ওয়েবভিউতে (ম্যানিফেস্টের সম্পূর্ণ অ্যাপ্লিকেশনটির চেয়ে) হার্ডওয়ার ত্বরণকে অক্ষম করেছি:

if (Build.VERSION.SDK_INT >= 11){
    webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

সিএসএস 3 অ্যানিমেশনগুলি এখন মসৃণ। আমরা অ্যান্ড্রয়েড 4.0 ব্যবহার করছি।

এখানে আরও তথ্য: https://code.google.com/p/android/issues/detail?id=17352


4
দুর্ভাগ্যক্রমে, এটি
এইচটিএমএল 5

খেয়াল করেনি। আমরা ভিডিওগুলি খেলতে একটি ভিডিও ভিউ ব্যবহার করেছি: সৌভাগ্যক্রমে আমাদের কেবল একটি পূর্ণ স্ক্রিনের ভিডিও দরকার। কর্মক্ষেত্র হিসাবে ওয়েবভিউটি স্বচ্ছ এবং পটভূমিতে একটি ভিডিও ভিউ খেলানো সম্ভব, যদিও আমি জানি যে এটি একই জিনিস নয়।
এনা

1
এই ফিক্সটি নিয়ে আরও একটি সমস্যা আছে। ওয়েবভিউ স্পর্শ করার সময় গ্রাফিকটি কিছুটা ব্যাঘাত পেয়ে যায়। উদাহরণস্বরূপ, যদি আপনার কোনও সিরল সহ কোনও চিত্র থাকে তবে আপনি মসৃণ লাইনের পরিবর্তে এর উপর সামান্য স্কোয়ার (পিক্সেল) দেখতে পাবেন। আমি বলতে পারি যে অ্যান্ড্রয়েডের সাথে 4.3 ফিক্স অকেজো, এটির কার্য সম্পাদনের সমস্যা নেই।
এনা

দুঃখিত, অ্যান্ড্রয়েডে কিছুটা নতুন। ম্যানিফেস্ট ফাইলটি এক্সএমএল হওয়ায় এই অ্যান্ড্রয়েড ম্যানিফেস্টে কি এই পেস্টযোগ্য? অথবা ওয়েবভিউ লোড করার সময় উত্স কোডে এটি বৈধ হওয়ার কথা। নুব প্রশ্নের জন্য দুঃখিত
xMythicx

1
যুক্ত করার পরে, এই ত্রুটিটি পাওয়ার পরেWebView not displayed because it is too large to fit into a software layer (or drawing cache), needs 11534400 bytes, only 8294400 available
বিকাশকারী

14

আমি মনে করি নিম্নলিখিতটি সর্বোত্তমভাবে কাজ করে:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

অ্যান্ড্রয়েড 19 এর ওয়েবভিউর জন্য ক্রোমিয়াম ইঞ্জিন রয়েছে। আমার ধারণা এটি হার্ডওয়্যার ত্বরণের সাথে আরও ভাল কাজ করে।


1
এই দরিদ্র অ্যানিমেশন এবং স্ক্রলিং সঙ্গে WebViews উপর আমার জন্য কাজ
ক্যালোরি

এটি আমি বা আপনার 'অন্য' আপনার 'যদি' এর মতোই করে তবে?
কোডবিট

এরউইনুস একটি হ'ল টাইপ_সফটওয়ার এবং অন্য হার্ডওয়্যার
ব্যবহারকারী 2582318

9

আমার এই একই সমস্যা ছিল এবং আমাকে এটি কাজ করতে হয়েছিল। আমি এই সমাধানগুলি চেষ্টা করেছিলাম, তবে শেষে পারফরম্যান্সটি, কমপক্ষে স্ক্রোলিংয়ের জন্য মোটেই উন্নতি হয়নি। সুতরাং এখানে আমি যে পরিশ্রম সম্পাদন করেছি এবং কেন এটি আমার জন্য কাজ করেছে তার ব্যাখ্যা।

আপনার যদি "মিউউইভিভিউ" ক্লাস তৈরি করে "অন টাচইভেন্ট" পদ্ধতিটি ওভাররাইট করে এবং প্রতিটি ড্র্যাগ ইভেন্টটি ঘটে থাকে সেই সময়টিতে কমপক্ষে মুদ্রণ করার সময় আপনি যদি ড্র্যাগ ইভেন্টগুলি অন্বেষণ করার সুযোগ পান তবে আপনি দেখতে পাবেন যে সেগুলি পৃথক হয়ে গেছে সময় অনুযায়ী (নিচে থেকে) 9ms দূরে। ইভেন্টগুলির মধ্যে এটি খুব অল্প সময়ের মধ্যে।

কটাক্ষপাত ওয়েবদৃশ্য সোর্স কোড , এবং শুধুমাত্র onTouchEvent ফাংশন দেখুন। প্রসেসর দ্বারা এটি 9 এমএসেরও কম সময়ে পরিচালনা করা অসম্ভব (স্বপ্ন দেখতে থাকুন !!!)। এ কারণেই আপনি ক্রমাগত "মিস ড্র্যাগ মিস্ হওয়ায় আমরা স্পর্শ ডাউন হওয়ার জন্য ওয়েবকোরের প্রতিক্রিয়ার জন্য অপেক্ষা করছি।" বার্তা। কোডটি ঠিক সময়ে হাতে নেওয়া যায় না।

কিভাবে ঠিক হবে এটা? প্রথমত, আপনি এটির উন্নতি করার জন্য অন টাচ ইভেন্ট কোডটি পুনরায় লিখতে পারবেন না, এটি কেবল খুব বেশি। তবে, চলনগুলি টেনে নিয়ে যাওয়ার ইভেন্টের হারকে সীমাবদ্ধ করতে আপনি "এটি উপহাস" করতে পারেন চলুন 40 মিমি বা 50 মিমি বলি। (এটি প্রসেসরের উপর নির্ভর করে)।

সমস্ত স্পর্শ ইভেন্টগুলি এরকম হয়: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP। সুতরাং আমাদের ডাউন এবং ইউপি চলাচল রাখা এবং চলমান হার ফিল্টার করা দরকার (এগুলি খারাপ লোক)।

এবং এটি করার একটি উপায় এখানে রয়েছে (আপনি 2 আঙ্গুলের স্পর্শের মতো আরও ইভেন্টের ধরণ যুক্ত করতে পারেন, আমি এখানে আগ্রহী সমস্তই একক আঙুলের স্ক্রোলিং)।

import android.content.Context;
import android.view.MotionEvent;
import android.webkit.WebView;


public class MyWebView extends WebView{

    public MyWebView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    private long lastMoveEventTime = -1;
    private int eventTimeInterval = 40;

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        long eventTime = ev.getEventTime();
        int action = ev.getAction();

        switch (action){
            case MotionEvent.ACTION_MOVE: {
                if ((eventTime - lastMoveEventTime) > eventTimeInterval){
                    lastMoveEventTime = eventTime;
                    return super.onTouchEvent(ev);
                }
                break;
            }
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP: {
                return super.onTouchEvent(ev);
            }
        }
        return true;
    }
}

অবশ্যই ওয়েবভিউয়ের পরিবর্তে এই শ্রেণিটি ব্যবহার করুন এবং আপনি স্ক্রোল করার সময় পার্থক্যটি দেখতে পাবেন।

এটি কেবলমাত্র একটি সমাধানের জন্য একটি দৃষ্টিভঙ্গি, তবুও ওয়েবভিউ ব্যবহার করার সময় পর্দা স্পর্শের কারণে সমস্ত পিছিয়ে থাকা মামলার জন্য এখনও পুরোপুরি প্রয়োগ করা হয়নি। তবে এটি আমার সন্ধানের সেরা সমাধান, কমপক্ষে আমার নির্দিষ্ট প্রয়োজনের জন্য।


আমি উল্লেখ করতে চাই যে আপনি পোস্ট করেছেন ওয়েব ভিউ সোর্স কোডটি ২০১০
সিকিউএম

এটি কাজ করে না, এটি স্ক্রোলিং মসৃণ করে না, আমি পার্থক্যটি অনুভব করতে পারি না।
neevek

আমি এই সীমাটি 80 টি পর্যন্ত সীমাবদ্ধতাটি প্রয়োগ করেছি, তবে এটি কার্য সম্পাদনকে উন্নত করে বলে মনে হচ্ছে না তবে এটি কিছু সরানো ইভেন্টগুলি ধারণ করে। এটি আপনার জন্য কি করে?
রাগনার

পড়েছেন যে কোনও ক্লিক ইভেন্টটি 6 বার ধীরে ধীরে স্পর্শ ইভেন্টের টাচস্টার্ট। বিলম্ব এড়ানোর জন্য আপনি $ ('# বোতাম') ব্যবহার করতে পারেন on
কোডবিট

এছাড়াও, আপনার এইচটিএমএল অ্যাপ্লিকেশনগুলিতে ক্লিক ইভেন্টটি ব্যবহার করবেন না, এটি ক্লিক ক্লিক করার জন্য, প্রতিটি ক্লিকে প্রতিক্রিয়া জানাতে 300ms বিলম্ব যুক্ত করে। পরিবর্তে টাচস্টার্ট ব্যবহার করা আরও ভাল। আমি একটি ক্লিকহ্যান্ডার তৈরি করেছি যা দুটি ইভেন্ট ব্যবহার করে এবং প্রথম ট্রিগার হওয়া ইভেন্টটি গ্রহণ করে। আমি 'টাচস্টার্ট ক্লিক' ব্যবহার করি, তাই এটি এখনও টাচস্ক্রিন ছাড়াই কাজ করে।
কোডবিট

9

আমি আমার ফোনগ্যাপ অ্যাপ্লিকেশনটিতে রেন্ডার পারফরম্যান্স সমস্যা সমাধানের জন্য সমস্ত প্রস্তাব চেষ্টা করেছি। কিন্তু বাস্তবে কিছুই কাজ করেনি।

অবশেষে, অনুসন্ধানের পুরো দিন পরে, আমি এটি তৈরি করেছি। আমি আমার অ্যান্ড্রয়েড ম্যানিফেস্টের ট্যাগের মধ্যে নেই (ট্যাগ নয়)

<application android:hardwareAccelerated="false" ...

এখন অ্যাপ্লিকেশনটি আমার ওয়েব ব্রাউজারের মতো দ্রুত আচরণ করে। দেখে মনে হচ্ছে, হার্ডওয়্যার ত্বরণ যদি সর্বদা সেরা বৈশিষ্ট্য না হয় ...

আমার যে বিশদ সমস্যাটি ছিল তা: https://stackoverflow.com/a/24467920/3595386


2
হার্ডওয়্যার
ত্বরণটি

5

এই উত্তরগুলির কোনওোটাই আমার পক্ষে সহায়ক ছিল না।

শেষ পর্যন্ত আমি কারণ এবং সমাধান খুঁজে পেয়েছি। কারণটি ছিল প্রচুর CSS3 ফিল্টার (ফিল্টার, -উইবকিট-ফিল্টার)।

সমাধান

এইচটিএমএল বডিটিতে "নিম্নমান" ক্লাস যুক্ত করতে আমি ওয়েব পৃষ্ঠার স্ক্রিপ্টে ওয়েবভিউ সনাক্তকরণ যুক্ত করেছি। BTW। আপনি ওয়েবভিউ সেটিংসে ব্যবহারকারী-এজেন্ট সেট করে খুব সহজেই ওয়েবভিউ ট্র্যাক করতে পারেন। তারপরে আমি নতুন সিএসএস বিধি তৈরি করেছি

body.lowquality * { filter: none !important; }

অদ্ভুত যখন 5 বছর পরে ডিভাইসগুলি দ্রুত হওয়া সত্ত্বেও ওয়েব ভিউ ব্যবহারের খুব কম কারণ রয়েছে, আরও মোবাইল ব্রাউজারের সামঞ্জস্যপূর্ণ পারফরম্যান্স ব্যাপকভাবে উন্নত হয়েছে এবং অন্যান্য কারণে। যদিও এটি দেখার জন্য ধন্যবাদ!
সিকিউএম

@ সিকিউএম আমার একই সমস্যা ছিল, আমি এর সমাধান পেয়েছি তাই আমি এটি ভাগ করে নিতে চেয়েছিলাম :)
l00k

আমি কেবল মুখোমুখি হচ্ছি, এটি আমার প্রাচীনতম প্রশ্নগুলির মধ্যে একটি, আবারও ধন্যবাদ!
সিকিউএম

1
এটি অযৌক্তিক যে এটি 2016/2017-এ একটি সমস্যা। সিএসএস ফিল্টারগুলির কোনওটিই কোনও মোবাইল জিপিইউর জন্য চ্যালেঞ্জিং হওয়া উচিত নয়।
অ্যাডাম লেগেট 16

4

আপনার ওয়েবভিউয়ের কয়েকটি মাত্র উপাদান যদি ধীর বা অবিরাম থাকে তবে উপাদান সিএসএসে এটি যুক্ত করার চেষ্টা করুন:

transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);

এটিই ছিল একমাত্র স্পিডহ্যাক যা আমার ওয়েবভিউতে সত্যই প্রভাব ফেলেছিল। তবে সাবধান! (আপনি এই নিবন্ধে হ্যাক সম্পর্কে আরও পড়তে পারেন ।)


1
ব্যবহার will-change: transform
অ্যাডাম লেগেট


3

আপনি যদি বাধ্য হয় onclick ইভেন্টটির সাথে এটি টাচ স্ক্রিনে ধীর হতে পারে।

এটি দ্রুততর করার জন্য, আমি ফাস্টক্লিক ব্যবহার করি , যা ক্লিক ইভেন্টের নকল করতে আরও দ্রুত স্পর্শ ইভেন্টগুলি ব্যবহার করে।


fastclick আর উন্নত করা হচ্ছে ... হ্যাঁ স্পর্শ ঘটনা ধীরে চলে এবং আমি শুধু কাজ করার জন্য এটি প্রয়োজন এবং jQuery সঙ্গে পাওয়া গতি ইস্যু ব্যবহার করে প্রায় কাজ করা যেতে পারে $('#').on('touchstart', function() {...});যেমন onclick উল্টোদিকে
CrandellWS
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.