একই থ্রেড ত্রুটিতে ওয়েবভিউ পদ্ধতিগুলি


88

আমার একটি অ্যান্ড্রয়েড প্রোগ্রাম রয়েছে (একটি ওয়েবভিউতে জাভা + এইচটিএমএল)। আমি জাভাস্ক্রিপ্ট থেকে জাভা কোডে কল করতে পারি। তবে অন্য উপায়ে কাজ করা বন্ধ হয়ে গেল (গ্রহনে আপডেটের পরে)।

তাই এটি আমি করার চেষ্টা করছি

  • একটি ওয়েবভিউ তৈরি করুন (কাজ করেছেন)
  • জাভাস্ক্রিপ্টে অ্যান্ড্রয়েডফানশন.টেস্টে কল করা (); (কাজ করছে)
  • জাভা পরীক্ষা () ফাংশন কল ওয়েবভিউ.লোডআর্ল ("জাভাস্ক্রিপ্ট: হ্যালোব্যাক ()"); (! আর কাজ করছে না)

আমি এটিকে মূলঅ্যাক্টিভিটিতে ওয়েবভিউ দিয়ে কাজ করার চেষ্টা করেছি, তবে এটি কার্যকর হয়নি।

মেইনএ্যাকটিভিটি.জভা

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final WebView webView = (WebView)findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient());
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        javascr = new Javascript(this, webView);
        webView.addJavascriptInterface(javascr, "AndroidFunction");
        webView.loadUrl("file:///android_asset/www/index.html");

        ....
}

জাভাস্ক্রিপ্ট.জভা

public class Javascript {   
    Context cont;
    WebView webView;

    Javascript(Context c, WebView w) {
        cont = c;
        webView = w;
    }

    // function called in the javascript by AndroidFunction.test();
    public void test() {
          // Breaking point!!!
        webView.loadUrl("javascript:helloBack()");
    }

ত্রুটি:

03-24 11:47:50.103: W/WebView(21026):   at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
03-24 11:47:50.103: W/WebView(21026):   java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper{41ab68f8} called on Looper{41bb70a8}, FYI main Looper is Looper{41ab68f8})

03-24 11:47:50.103: W/WebView(21026):   at android.webkit.WebView.checkThread(WebView.java:2063)
03-24 11:47:50.103: W/WebView(21026):   at android.webkit.WebView.loadUrl(WebView.java:794)
03-24 11:47:50.103: W/WebView(21026):   at com.example.hellobt.Javascript.test(Javascript.java:24)

03-24 11:47:50.103: W/WebView(21026):   at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
03-24 11:47:50.103: W/WebView(21026):   at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
03-24 11:47:50.103: W/WebView(21026):   at android.os.Handler.dispatchMessage(Handler.java:102)

03-24 11:47:50.103: W/WebView(21026):   at android.os.Looper.loop(Looper.java:137)
03-24 11:47:50.103: W/WebView(21026):   at android.os.HandlerThread.run(HandlerThread.java:61)

উত্তর করার জন্য ধন্যবাদ. আমি আমার জাভাস্ক্রিপ্ট ফাইলটিতে ফাংশনটি সম্পাদনা করেছি:

private void test(final String s) {
        webView.post(new Runnable() {
            public void run() {
                webView.loadUrl("javascript:" + s + ";");
            }
        });
        System.out.println("javscript done..");
    }

আপনার সম্পাদনায় আপনি উল্লেখ করেছেন যে আপনি উত্তরগুলির (একটি) এর উপর ভিত্তি করে আপনার কোড পরিবর্তন করেছেন, এটি এমন শব্দ করে তোলে যা এখনও আপনার সমস্যার সমাধান করেনি - তবে একটি স্বীকৃত উত্তর রয়েছে। আমি আপনাকে এটি সুস্পষ্ট করার পরামর্শ দিয়েছি এটি সমস্যার সমাধান করেছে কি না (বা অন্যথায় কেবল সম্পাদনাটিকে পূর্বাবস্থায় ফিরিয়ে আনবে)।
টম

উত্তর:


214

জাভাস্ক্রিপ্ট পদ্ধতিটি একটি পটভূমিতে (যেমন নন-ইউআই) থ্রেডে চালিত হয়। ইউআই থ্রেডে আপনাকে সমস্ত অ্যান্ড্রয়েড ভি সম্পর্কিত সম্পর্কিত পদ্ধতিগুলি কল করতে হবে। আপনার যা প্রয়োজন তা অর্জন করতে পারেন:

mWebView.post(new Runnable() {
    @Override
    public void run() {
        mWebView.loadUrl(...).
    }
});

যা ইউআই থ্রেডে চালানোর জন্য টাস্ক পোস্ট করবে।


আপনি কোথায় আপনার মূল কোডটিতে স্নিপেট (এমউয়েবভিউ) যুক্ত করেছেন?
বোয়ি

পরীক্ষা () ফাংশনে, আমার উপরের প্রশ্নটি দেখুন।
জোহান হিক্সমা

আপনার যদি কোনও মূল্য ফেরত দেওয়ার দরকার হয়? যেমন Webview.getUrl ফিরবেন? stackoverflow.com/questions/29748782/... @JohanHoeksma
সুরেশ Subedi

কীভাবে এবং কখন এই সমস্যাটি ঘটেছিল জানেন? আমার নেক্সাস 5 এক্স (অ্যান্ড্রয়েড 7.1.1) এ, ঠিক আছে তবে কিছু ডিভাইস ক্র্যাশ হয়েছে।
এলি জোউ

একটি ভেরিয়েবল পাস কিভাবে? আমি mWebView.loadUrl ("জাভাস্ক্রিপ্ট: পরীক্ষা ('" + মাইডাটা + ""); "); এ পরিবর্তনশীল যুক্ত করার চেষ্টা করেছি; তবে মানটি কখনই জাভাস্ক্রিপ্টে পাস হবে না!
ব্যবহারকারী 1788736

15

আমার ক্ষেত্রে কোনও ওয়েবভিউতে কিছুই দেখানো হয়নি, তাই আমি অন্য কোনও উপায়ে পছন্দ করি:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        final WebView webView = (WebView) findViewById(R.id.map);
        webView.loadDataWithBaseURL(...);
    }
});

3

পোস্ট পদ্ধতি ব্যবহার করে এটি আসতে পারে। নীচের কোড মাধ্যমে যান।

 m_targetView.post(new Runnable() {
                        @Override
                        public void run() {
                            m_targetView.loadUrl(".....");
                        }
                    });

3

জাভা সংস্করণ: আপনার চলমানযোগ্য ইন্টারফেস এবং পোস্ট থেকে হ্যান্ডলারের অবশ্যই ব্যবহার করতে হবে ।

webView.post(new Runnable() {
          @Override
          public void run() {
             webView.loadUrl("file:///android_asset/www/index.html");
          }
       });

কোটলিন সংস্করণ:

webView.post(new Runnable {
   webView.loadUrl("file:///android_asset/www/index.html")
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.