如果您对GWT,GoogleAppEngine,TimerTask或ServiceImpl中的线程抛出异常和googlethread感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解GWT,Goo
如果您对GWT,Google App Engine,TimerTask或ServiceImpl中的线程抛出异常和google thread感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解GWT,Google App Engine,TimerTask或ServiceImpl中的线程抛出异常的各种细节,并对google thread进行深入的分析,此外还有关于AddSingleton
- GWT,Google App Engine,TimerTask或ServiceImpl中的线程抛出异常(google thread)
- AddSingleton
() 如何工作 - Andorid之提示java.lang.RuntimeException: Unable to start service net.gotev.uploadservice.UploadService@
- Android Simple Timer / Timertask问题
- AppEngine ClassNotFoundException:com.google.appengine.api.datastore.DatastoreServiceFactory
GWT,Google App Engine,TimerTask或ServiceImpl中的线程抛出异常(google thread)
我正在使用GWT和Google App Engine。我有很多记录,我想每30分钟更新一次。在 ServiceImpl中, 我有以下代码:
new Timer().schedule(new TimerTask(){ @Override public void run() { try { Thread.sleep(30000); } catch (InterruptedException e) { e.printStackTrace(); } result = updateFeeds(); }}, 30000,Long.MAX_VALUE);
当我运行应用程序以及何时获得:
com.google.gwt.user.server.rpc.UnexpectedException:Service method ''public abstract java.util.List org.joke.planet.client.FeedService.loadFeeds()'' threw an unexpected exception:java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup)
在第一行或粘贴的代码处。
我的问题是,我如何才能使可以在GWT + AppEngine Service中工作的后台工作者?
答案1
小编典典您不能使用java.util.Timer,因为它会创建一个普通线程,这在AppEngine中是不允许的。但是,您可以使用AppEngine Modules
API的Background线程功能,如此处所述:https
:
//developers.google.com/appengine/docs/java/modules/#Java_Background_threads
请注意,您只能在手动缩放的实例上使用后台线程。在此示例中,后台线程永远每30秒打印一次消息:
Thread thread = ThreadManager.createBackgroundThread(new Runnable() { public void run() { try { while (true) { System.err.println("Doing something!"); Thread.sleep(30_000); } } catch (InterruptedException ex) { } }});thread.start();
AddSingleton() 如何工作
此方法采用两个类型参数 TService
和 TImplementation
,以及零个方法参数。
这个方法的完整签名和实现看起来像
public static IServiceCollection AddSingleton<TService,TImplementation>(this IServiceCollection services)
where TService : class
where TImplementation : class,TService
{
if (services == null)
throw new ArgumentNullException(nameof(services));
return services.AddSingleton(typeof(TService),typeof(TImplementation));
}
类型参数告诉您作为开发人员,您应该期望 IoC 容器对 TService
的任何解析都将返回 TImplementation
的单个实例。 where TImplementation : class,TService
的类型安全检查表明返回的实际类必须实现(或成为)TService
。
实际的 TImplementation
是如何创建的,取决于容器,并依赖于 TImplementation
的构造函数上的零个或多个构造函数参数。
您的问题“该方法不应该看起来像这样”,通常答案是“不”。原因是该签名要求您有两个实际对象(实际上可能是一个对象通过了两次)已经构建,这通常首先违背了依赖注入的目的。
类型参数不必对应于实际的方法参数,尽管它们经常(通常)这样做。在这种特殊情况下,类型参数本身作为 Type
类型的实际参数传递给另一个方法,然后 IoC 实现的其余部分使用这些参数来创建正确的对象。
那么他们为什么要这样做而不只是拥有services.AddSingleton(Type serviceType,Type implementationType)
?。答案在于类型安全。此签名不是类型安全的,因为您可以调用 services.AddSingleton(typeof(Animal),typeof(House))
,这没有意义并且会在运行时失败。相比之下,services.AddSingleton<Animal,House>()
甚至无法编译。
Andorid之提示java.lang.RuntimeException: Unable to start service net.gotev.uploadservice.UploadService@
1 问题
用android-upload-service上传一个文件提示错误如下
04-15 17:46:33.245 24932 24932 E AndroidRuntime: Process: com.appsinnova.android.keepshare, PID: 24932
04-15 17:46:33.245 24932 24932 E AndroidRuntime: java.lang.RuntimeException: Unable to start service net.gotev.uploadservice.UploadService@ce7b171 with Intent { act=net.gotev.uploadservice.action.upload cmp=packageName/net.gotev.uploadservice.UploadService (has extras) }: java.lang.IllegalArgumentException: Hey dude, please set the namespace for your app by following the setup instructions: https://github.com/gotev/android-upload-service/wiki/Setup
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4013)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at android.app.ActivityThread.access$1800(ActivityThread.java:229)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1908)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at android.os.Looper.loop(Looper.java:226)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7223)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:576)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:961)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Hey dude, please set the namespace for your app by following the setup instructions: https://github.com/gotev/android-upload-service/wiki/Setup
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at net.gotev.uploadservice.UploadService.onStartCommand(UploadService.java:257)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3980)
04-15 17:46:33.245 24932 24932 E AndroidRuntime: ... 8 more
04-15 17:46:33.247 606 635 I vendor.mediatek.hardware.power@2.1-impl: notifyAppState_2_1 pack:com.appsinnova.android.keepshare, act:com.appsinnova.android.keepshare, pid:24932, uid:10293, state:3
04-15 17:46:33.263 24932 24932 I Process : Sending signal. PID: 24932 SIG: 9
04-15 17:46:33.350 1254 3575 D Dex2oatManagerService: Display listener for pid 24932 died.
2 原因
UploadService没有注册
3 解决办法
在继承的Application类里面的onCreate函数里面添加如下代码
override fun onCreate() {
super.onCreate()
UploadService.NAMESPACE = packageName;
}
- 点赞
- 收藏
- 分享
-
- 文章举报

Android Simple Timer / Timertask问题
editText = (EditText) findViewById(R.id.edit_message); Timer time = new Timer(); time.schedule(new TimerTask() { public void run() { timesince++; editText.setText("Timeran:"+timesince); Log.d("TIMER","TimerTask run"); }},1000);
所以希望它会以更高的值(timesince)更新文本框 – 在程序顶部声明,以及editText ……
但是,(虽然我没有编译问题)当我在模拟器上运行它时根本不起作用. App说’blahblahblah已停止工作……’
我做定时器错了吗?我错过了什么?
非常感谢.
(如果删除此代码,P.S.App工作正常,因此我知道此部分存在问题.)
编辑:我相信这是我的logcat输出,抱歉文本墙:
10-11 03:40:49.260: E/AndroidRuntime(561): FATAL EXCEPTION: Timer-0 10-11 03:40:49.260: E/AndroidRuntime(561): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:3939) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:714) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:763) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4012) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.View.invalidate(View.java:8454) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.invalidateCursor(TextView.java:4319) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.spanChange(TextView.java:7670) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:8020) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:898) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:614) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:520) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.Selection.setSelection(Selection.java:76) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.Selection.setSelection(Selection.java:87) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.setText(TextView.java:3244) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.setText(TextView.java:3110) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.EditText.setText(EditText.java:78) 10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.setText(TextView.java:3085) 10-11 03:40:49.260: E/AndroidRuntime(561): at com.example.cultivation.MainActivity$1.run(MainActivity.java:54) 10-11 03:40:49.260: E/AndroidRuntime(561): at java.util.Timer$TimerImpl.run(Timer.java:284)
解决方法
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这就是问题
您必须将更新ui的后台任务部分移动到主线程上,或者在UI线程中创建mHandler;
更新:
从计时器更新UI:http://android-developers.blogspot.com/2007/11/stitch-in-time.html
AppEngine ClassNotFoundException:com.google.appengine.api.datastore.DatastoreServiceFactory
当我尝试在AppEngine中使用低级DataStore
API时,我得到了一个有趣的东西ClassNotFoundException
。此异常发生在云服务器中,而不是在本地实例中。我在本地使用appengine-java-sdk-1.7.4
。
java.lang.NoClassDefFoundError: com/google/appengine/api/datastore/DatastoreServiceFactory at org.himadri.scradiolisteners.server.FetchingServlet.writeDataLowLevel(FetchingServlet.java:47) at org.himadri.scradiolisteners.server.FetchingServlet.doGet(FetchingServlet.java:39) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447) at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454) at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461) at com.google.tracing.TraceContext.runInContext(TraceContext.java:703) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330) at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458) at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) at java.lang.Thread.run(Thread.java:679)Caused by: java.lang.ClassNotFoundException: com.google.appengine.api.datastore.DatastoreServiceFactory at com.google.appengine.runtime.Request.process-e485d13152ebc944(Request.java) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) at org.himadri.scradiolisteners.server.FetchingServlet.writeDataLowLevel(FetchingServlet.java:47) at org.himadri.scradiolisteners.server.FetchingServlet.doGet(FetchingServlet.java:39) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454) at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461) at com.google.tracing.TraceContext.runInContext(TraceContext.java:703) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330) at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458) ... 1 more
答案1
小编典典听起来对我来说是两件事之一。
1:您正在尝试在单元测试中运行GAE代码,在这种情况下,您需要使用此页面中指定的代码。
2:您没有将所有必需的jar添加到类路径中。
关于GWT,Google App Engine,TimerTask或ServiceImpl中的线程抛出异常和google thread的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AddSingleton
本文标签: