GVKun编程网logo

GWT,Google App Engine,TimerTask或ServiceImpl中的线程抛出异常(google thread)

14

如果您对GWT,GoogleAppEngine,TimerTask或ServiceImpl中的线程抛出异常和googlethread感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解GWT,Goo

如果您对GWT,Google App Engine,TimerTask或ServiceImpl中的线程抛出异常google thread感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解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,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>() 如何工作

AddSingleton() 如何工作

此方法采用两个类型参数 TServiceTImplementation,以及零个方法参数。

这个方法的完整签名和实现看起来像

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@

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;
    }

 

  • 点赞
  • 收藏
  • 分享
    • 文章举报
chen.yu
发布了1091 篇原创文章 · 获赞 710 · 访问量 316万+
他的留言板 关注

Android Simple Timer / Timertask问题

Android Simple Timer / Timertask问题

我试图让一个基本的计时器在 Android上工作,我在onCreate()方法中有以下代码:

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 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() 如何工作、Andorid之提示java.lang.RuntimeException: Unable to start service net.gotev.uploadservice.UploadService@、Android Simple Timer / Timertask问题、AppEngine ClassNotFoundException:com.google.appengine.api.datastore.DatastoreServiceFactory等相关知识的信息别忘了在本站进行查找喔。

本文标签: