Python Kivy UrlRequest不';t触发器回调
这是我尝试做的最简单的版本。这是我的Python Kivy UrlRequest不';t触发器回调,python,callback,garbage-collection,kivy,Python,Callback,Garbage Collection,Kivy,这是我尝试做的最简单的版本。这是我的main.py文件: class MainScreen(Screen): def __init__(self): super(MainScreen, self).__init__() self.url_input = TextInput() self.start = Button(text='Download') self.start.bind(on_release=partial(se
main.py
文件:
class MainScreen(Screen):
def __init__(self):
super(MainScreen, self).__init__()
self.url_input = TextInput()
self.start = Button(text='Download')
self.start.bind(on_release=partial(self.on_start_press))
self.add_widget(self.url_input)
self.add_widget(self.start)
def on_start_press(self, *args):
DownloadTask(self.url_input.text)
...
这是我的task.py文件,其中包含下载任务
class DownloadTask(object):
def __init__(self, url):
self.url = url
self._get_headers()
def _get_headers(self):
UrlRequest(url=self.url, on_success=self._on_headers_fetched, method='HEAD')
def _on_headers_fetched(self, req, resp):
self.content_length = int(req.resp_headers.get('Content-Length'))
但从未调用on_success回调。在urlrequest.py
的第439行:
if self.on_success:
func = self.on_success()
if func:
func(self, data)
func
为None
,因此不调用回调。另外,weakmethod.py
中的第47行引发了ReferenceError:尝试访问self.proxy
时,弱引用对象不再存在
try:
if self.proxy:
return getattr(self.proxy, self.method_name)
except ReferenceError:
pass
return self.method
这里的问题是什么?我的DownloadTask()
对象是否已被垃圾回收
环境:Python 3.5.3、Kivy 1.10.0、mac os编辑:在显示后,我觉得下载任务
对象是垃圾收集的,因此线程
由UrlRequest
a运行,用于不存在的对象的方法-因此崩溃
我不确定它是否是垃圾收集的,但是请求会创建一个守护进程线程
,因此您不应该太在意(请随意查找)。关于它有一个很好的解释,所以它可能还没有被收集
然而,UrlRequest
强烈依赖于Kivy,这是可见的。它使用奇维。这意味着,除非运行Kivy应用程序,否则请求不会继续,即它应该停止。只要尝试将任何print('something')
添加到UrlRequest.\u dispatch\u result()
中,您就会看到它被完全忽略,因为KivyClock
没有计时(因此没有调用该函数)
然而,在这个示例中,实际运行的Kivy应用程序没有问题
from kivy.app import runTouchApp
from kivy.uix.widget import Widget
from kivy.network.urlrequest import UrlRequest
class My(Widget):
def __init__(self, **kwargs):
super(My, self).__init__(**kwargs)
UrlRequest(
url='http://lipsum.com/',
on_error=lambda *args: print('error:', args),
on_failure=lambda *args: print('fail:', args),
on_redirect=lambda *args: print('redir:', args),
on_success=lambda *args: print('success:', args)
)
runTouchApp(My())
实际上UrlRequest.\u dispatch\u result()
被调用。我不是在kivy应用程序上下文中调用此代码的。如果您想查看,这是源代码。这是我看到的主要文件。然后在中,我相信您的DownloadTask
对象已被收集。此外,如果我将函数而不是方法设置为回调,则该函数将被调用,尝试将DownloadTask(…)
更改为self.task=DownloadTask(…)
并查看发生了什么。我这样做了,它不再被收集!谢谢你能详细说明一下吗?