在 Android Kivy 应用程序上保存当前 URL

Posted

技术标签:

【中文标题】在 Android Kivy 应用程序上保存当前 URL【英文标题】:Saving current URL on Android Kivy Application 【发布时间】:2015-01-08 03:12:20 【问题描述】:

我的代码:

import kivy                                                                                     
from kivy.app import App                                                                        
from kivy.lang import Builder                                                                   
from kivy.utils import platform                                                                 
from kivy.uix.widget import Widget                                                              
from kivy.clock import Clock                                                                    
from jnius import autoclass                                                                     
from android.runnable import run_on_ui_thread                                                   

WebView = autoclass('android.webkit.WebView')                                                   
WebViewClient = autoclass('android.webkit.WebViewClient')                                       
activity = autoclass('org.renpy.android.PythonActivity').mActivity
WebView = autoclass('android.webkit.WebView')                                                  
WebViewClient = autoclass('android.webkit.WebViewClient')                                      
activity = autoclass('org.renpy.android.PythonActivity').mActivity                              

class Wv(Widget):                                                                              
    def __init__(self, **kwargs):                                                            
        super(Wv, self).__init__(**kwargs)                                                      
        Clock.schedule_once(self.create_webview, 0)                                            

    @run_on_ui_thread                                                                          
    def create_webview(self, *args):                                                            
        webview = WebView(activity)                                                            
        webview.getSettings().setjavascriptEnabled(True)                                        
        wvc = WebViewClient();                                                                  
        webview.setWebViewClient(wvc);                                                          
        activity.setContentView(webview)                                                        
        webview.loadUrl('www.google.com')

class ServiceApp(App):                                                                          
    def build(self):                                                                        
        return Wv()
    def on_pause(self):
        return True
    def on_resume(self):
        return Wv()

if __name__ == '__main__':                                                                      
    ServiceApp().run()

应用程序运行良好,但我想在 on_pause 事件触发时保存当前 URL,然后 当 on_resume 事件我想返回那个 URL。

我不知道该怎么做。

建议?

【问题讨论】:

我想您是在询问如何在 on_pause 事件期间以线程安全的方式访问 Webview,因为它在 ui 线程中运行。在 java 中,WebView.WebViewTransport 类用于通过设置目标处理程序对象将 webview 传递给其他线程。 codota.com/android/scenarios/518913a0da0a50347f673d4f/… 我对适用于 Android 的 Python 了解得不够多,无法说明这种方法是否可行,但向邮件列表询问可能是个好主意.... 使用 Java 时,有一种方法可以获取您所在的当前 url。你在这里为 WebView 使用什么 python 模块? 我现在在我的帖子中包含了导入 【参考方案1】:

编辑:我很好奇,然后继续检查。事实上,我得到一个 java.lang.RuntimeException: Probable deadlock detected due to WebView API was called on wrong thread while UI thread is blocked。 有必要对 WebViewClient 进行子类化,我不确定如何在 jnius 中执行此操作。

我认为您可以毫无问题地访问您的网址。小部件树如下所示: 服务应用程序-> Wv 但是您没有使 webview 成为 Wv 的成员。你应该这样做:

@run_on_ui_thread
def create_webview(self, *args):
    self.webview = WebView(activity)
    self.webview.getSettings().setJavaScriptEnabled(True)
    wvc = WebViewClient();
    self.webview.setWebViewClient(wvc);
    activity.setContentView(self.webview)
    self.webview.loadUrl('www.google.com')

在这之后,我认为你可以这样做:

class ServiceApp(App):
    def build(self):
        self.wv = Wv()
        return wv
    def on_pause(self):
        # do something with url, I don't know the android API that well
        # from http://developer.android.com/reference/android/webkit/WebView.html
        self.wv.webview.getUrl()
        return True
    def on_resume(self):
        # Here I have doubts why you create another widget but ok
        self.wv = Wv()
        return wv

我不确定有很多部分,需要进行测试以确保这样可以安全进行,但这是一个开始。我的 2 美分。

【讨论】:

以上是关于在 Android Kivy 应用程序上保存当前 URL的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 相机代码无法在 android 设备上运行

Python/Kivy/Buildozer - 应用程序在 Android 中崩溃,但在 PC 上运行良好

保存 Kivy 应用程序的登录屏幕用户名和密码

使用 buildozer 在 android 上部署 kivy 应用程序时出错

kivy在Android上运行,有人弄过吗

在 android for windows 上运行 kivy