在本文中,我们将给您介绍关于来自QWidget的“必须在QPaintDevice之前构造一个QApplication”的详细内容,此外,我们还将为您提供关于android–ApplicationSta
在本文中,我们将给您介绍关于来自QWidget的“必须在QPaintDevice之前构造一个QApplication”的详细内容,此外,我们还将为您提供关于android – ApplicationStatus类E / SysUtils:ApplicationStat中的ApplicationContext为null、android – “必须在此操作中指定至少一个ID字段(installationId,deviceToken)”解析、ApplicationListener ApplicationContextAware ApplicationEvent使用、dagger2错误“没有@Inject构造函数或@Provides注释方法无法提供android.app.Application”的知识。
本文目录一览:- 来自QWidget的“必须在QPaintDevice之前构造一个QApplication”
- android – ApplicationStatus类E / SysUtils:ApplicationStat中的ApplicationContext为null
- android – “必须在此操作中指定至少一个ID字段(installationId,deviceToken)”解析
- ApplicationListener ApplicationContextAware ApplicationEvent使用
- dagger2错误“没有@Inject构造函数或@Provides注释方法无法提供android.app.Application”
来自QWidget的“必须在QPaintDevice之前构造一个QApplication”
我正忙于将IRC客户端从Python
2.6移植到3.3,我偶然发现了PyQt的问题。该应用程序最初使用PyQt4,但我也对其进行了编码,以使其能够与PyQt5一起使用,但是却出现了一个错误,没有任何行引用:“
QWidget:必须在QPaintDevice之前构造一个QApplication”。我已将问题缩小到一堂课。
我知道这里已经被问过很多次了,但是我无法为我的案子提一个肯定的答案,因此,如果我的问题显得无知,我深表歉意。
这里是一些代码:http :
//pastebin.com/Lj60icgQ
愚蠢的是我没有在应有的导入语句之后放置“ app”变量。然后,我将其余代码放在主文件的底部,而不再出现该错误。谢谢您的帮助!
答案1
小编典典恐怕单个文件在这种情况下是不够的-
仅从这一模块来看执行流程还不清楚。当您尝试使用某些资源/创建一些需要初始化QApplication的对象时,通常会出现问题消息,例如QIcon。
基于Qt的GUI应用程序的实例化通常如下所示:
if __name__ == "__main__": app = QtGui.QApplication(sys.argv) main_window = MainWindowClass() main_window.show() sys.exit(app.exec_())
android – ApplicationStatus类E / SysUtils:ApplicationStat中的ApplicationContext为null
E / SysUtils:ApplicationStat中的ApplicationContext为null
有谁知道ApplicationStatus类?我没有在我的项目中
它发生在我在openGL中快速渲染纹理时
解决方法
我的问题是在打开新意图时直接传递额外的变量,如下所示.
>调用代码:
intent.putExtra("markerdata: ",assetVO);
>接收代码:
markerdata = (HashMap<String,Object>) getIntent().getSerializableExtra("markerdata");
2天前升级到Android Studio 1.3后,我总是变为空.
所以我的工作是将传递的信息捆绑在一起:
>调用代码:
Bundle b = new Bundle(); b.putSerializable("markerdata",assetVO); intent.putExtras(b);
>接收代码:
Bundle extras = getIntent().getExtras(); markerdata = (HashMap<String,Object>) extras.getSerializable("markerdata");
现在它的工作原理.希望它可以帮助别人.
android – “必须在此操作中指定至少一个ID字段(installationId,deviceToken)”解析
当您重新安装应用程序时,它会拧紧所有内容.
如stackoverflow在Eran所述:
“PushService.subscribe似乎将订阅缓存在本地存储中,以避免在多次启动应用程序时重新订阅.
这是该方法的第一个参数用于:
context – 用于访问本地存储以缓存订阅,因此它当前必须是可行的上下文.
(引自here).
但是,卸载应用程序时,将从您的设备中删除该应用程序的本地存储,因此新安装将导致PushService.subscribe重新注册到Google Cloud Messaging.如果新注册返回新的注册ID,则Parse将具有两个注册ID,可用于向您的应用发送推送通知,并且它们都将链接到您提供给订阅的相同userName.因此,向该userName发送通知会将其发送到两个注册ID,导致它到达两次.
当Parse为您发送通知时,他们应该通过canonical_registration_id从Google获取回复,这会让他们知道您设备上与您的应用相关联的注册ID之一已过时,不应再使用了.因此(假设Parse有一个不错的GCM实现),下次你向设备发送通知时,你应该只收到一次.“
这是我的安装源代码:
String androidId = Secure.getString(getApplicationContext().getContentResolver(),Secure.ANDROID_ID); Parse.initialize(this,"KEY1","KEY2"); PushService.setDefaultPushCallback(this,ParseActivity.class); ParseInstallation installation = ParseInstallation.getCurrentInstallation(); installation.put("UniqueId",androidId); installation.setobjectId(null); installation.saveInBackground();
我的堆栈跟踪(像每个人一样):
05-20 19:47:35.630: E/ParseCommandCache(6497): com.parse.ParseException: at least one ID field (installationId,devicetoken) must be specified in this operation 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.ParseCommand.onPostExecute(ParseCommand.java:334) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.ParseRequest$5.then(ParseRequest.java:321) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.ParseRequest$5.then(ParseRequest.java:318) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11.run(Task.java:481) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$ImmediateExecutor.execute(Task.java:673) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.completeAfterTask(Task.java:477) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.continueWithTask(Task.java:353) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.continueWithTask(Task.java:364) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$9.then(Task.java:410) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$9.then(Task.java:402) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11.run(Task.java:481) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$ImmediateExecutor.execute(Task.java:673) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.completeAfterTask(Task.java:477) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.access$400(Task.java:22) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$7.then(Task.java:346) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$7.then(Task.java:343) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.runcontinuations(Task.java:510) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.access$800(Task.java:22) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$taskcompletionsource.trySetResult(Task.java:565) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$taskcompletionsource.setResult(Task.java:599) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11$1.then(Task.java:493) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11$1.then(Task.java:485) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$10.run(Task.java:448) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$ImmediateExecutor.execute(Task.java:673) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.completeImmediately(Task.java:444) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.access$300(Task.java:22) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$6.then(Task.java:311) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$6.then(Task.java:308) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.runcontinuations(Task.java:510) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.access$800(Task.java:22) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$taskcompletionsource.trySetResult(Task.java:565) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$taskcompletionsource.setResult(Task.java:599) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11$1.then(Task.java:493) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11$1.then(Task.java:485) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$10.run(Task.java:448) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$ImmediateExecutor.execute(Task.java:673) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.completeImmediately(Task.java:444) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.access$300(Task.java:22) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$6.then(Task.java:311) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$6.then(Task.java:308) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.runcontinuations(Task.java:510) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.access$800(Task.java:22) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$taskcompletionsource.trySetResult(Task.java:565) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$taskcompletionsource.setResult(Task.java:599) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11$1.then(Task.java:493) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11$1.then(Task.java:485) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$10.run(Task.java:448) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$ImmediateExecutor.execute(Task.java:673) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.completeImmediately(Task.java:444) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.continueWith(Task.java:318) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.continueWith(Task.java:329) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11.run(Task.java:485) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$ImmediateExecutor.execute(Task.java:673) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.completeAfterTask(Task.java:477) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.access$400(Task.java:22) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$7.then(Task.java:346) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$7.then(Task.java:343) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.runcontinuations(Task.java:510) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.access$800(Task.java:22) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$taskcompletionsource.trySetResult(Task.java:565) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$taskcompletionsource.setResult(Task.java:599) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11$1.then(Task.java:493) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11$1.then(Task.java:485) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$10.run(Task.java:448) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$ImmediateExecutor.execute(Task.java:673) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.completeImmediately(Task.java:444) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.continueWith(Task.java:318) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task.continueWith(Task.java:329) 05-20 19:47:35.630: E/ParseCommandCache(6497): at com.parse.Task$11.run(Task.java:485) 05-20 19:47:35.630: E/ParseCommandCache(6497): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 05-20 19:47:35.630: E/ParseCommandCache(6497): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 05-20 19:47:35.630: E/ParseCommandCache(6497): at java.lang.Thread.run(Thread.java:841) 05-20 19:48:32.615: D/Request(6497): Warning: Sessionless Request needs token but missing either application ID or client token.
由于我没有找到任何真正的解决方案,我在这里问.
谢谢.
解决方法
我目前正在使用Parse 1.5.1:
我看到的是没有devicetoken就不会发送推送,如果没有uniqueId,我们会在上面得到运行时错误.
如果我在注册后立即发送UniqueId,则会保存没有devicetoken的行.
在Nexus 5,Nexus 4和Sony xperia E上测试的解决方案:
在您的Application类onCreate()中
Parse.initialize(this,PARSE_APP_KEY_VALUE,PARSE_CLIENT_KEY_VALUE); PushService.setDefaultPushCallback(getApplicationContext(),MainActivity.class); final ParseInstallation installation = ParseInstallation.getCurrentInstallation(); final String androidId = Settings.Secure.getString(getApplicationContext().getContentResolver(),Settings.Secure.ANDROID_ID); // Post the uniqueId delayed Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { installation.put("UniqueId",androidId); installation.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { // Saved! } }); } },10000 );
以这种方式工作,我能够保存正确的行(使用uniqueId和devicetoken),并发送推送通知!干杯!
ApplicationListener ApplicationContextAware ApplicationEvent使用
AppCacheContext.JAVA
方法一:implements ApplicationListener
@SuppressWarnings("rawtypes")
public class AppCacheContext implements ApplicationListener{
Logger logger = LoggerFactory.getLogger(AppCacheContext.class);
@Autowired
private static AppCacheContextDao cacheDao;
public void onApplicationEvent(ApplicationEvent event) {
Class<? extends ApplicationEvent> clazz = event.getClass();
System.out.println(clazz.getName());
if(event instanceof ContextRefreshedEvent){
ApplicationContext appcontext = ((ApplicationContextEvent) event).getApplicationContext().getParent();
if(appcontext != null){
try {
// 数据字典初始化
initDicDetailCache();
logger.info("----------------数据字典初始化完成----------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
方法二:ApplicationListener<ContextRefreshedEvent>
@SuppressWarnings("rawtypes")
public class AppCacheContext implements ApplicationListener<ContextRefreshedEvent>{
Logger logger = LoggerFactory.getLogger(AppCacheContext.class);
@Autowired
private static AppCacheContextDao cacheDao;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
ApplicationContext appcontext = event.getApplicationContext().getParent();
if(appcontext != null){
try {
// 数据字典初始化
initDicDetailCache();
logger.info("----------------数据字典初始化完成----------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
在ApplicationListener<ContextRefreshedEvent>使用时,会存在一个问题,在web 项目中(spring mvc),系统会存在两个容器,一个是root application context (过程中) ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器,初始完成之后)。这种情况下,就会造成onApplicationEvent方法被执行两次。根据自己的需求使用。
上述例子是初始化缓存,在完成之后执行。
解决办法可参考:https://my.oschina.net/u/2369810/blog/682899?nocache=1501657886165
dagger2错误“没有@Inject构造函数或@Provides注释方法无法提供android.app.Application”
我正在尝试在我的项目中实现dagger2,但遇到错误“
android.app.Application必须在没有@Inject构造函数或@Provides注释方法的情况下才能提供 ”。
这是我的代码:
App.java
package com.poppmedia.wallpaperautomaton;import android.app.Application;import com.poppmedia.wallpaperautomaton.di.DaggerAppComponent;import dagger.android.AndroidInjector;import dagger.android.DaggerApplication;/** * The Android {@link Application}. */public class App extends DaggerApplication { @Override protected AndroidInjector<? extends DaggerApplication> applicationInjector() { return DaggerAppComponent.builder().create(this); }}
di / AppModule.java
package com.poppmedia.wallpaperautomaton.di;import android.app.Application;import android.content.Context;import javax.inject.Singleton;import dagger.Binds;import dagger.Module;/** * Provider application-wide dependencies. */@Modulepublic interface AppModule { @Binds @Singleton Context bindContext(Application application);}
di / AppComponent.java
package com.poppmedia.wallpaperautomaton.di;import com.poppmedia.wallpaperautomaton.App;import javax.inject.Singleton;import dagger.Component;import dagger.android.AndroidInjector;import dagger.android.support.AndroidSupportInjectionModule;/** * Injects application dependencies. */@Singleton@Component(modules = { AndroidSupportInjectionModule.class, AppModule.class,})public interface AppComponent extends AndroidInjector<App> { @Component.Builder abstract class Builder extends AndroidInjector.Builder<App> {}}
di / TestClassModule.java
package com.poppmedia.wallpaperautomaton.di;import android.content.Context;import com.poppmedia.wallpaperautomaton.TestClass;import javax.inject.Singleton;import dagger.Module;import dagger.Provides;@Modulepublic class TestClassModule { @Provides @Singleton TestClass provideTestClass(Context context) { return new TestClass(context); }}
di / TestClassComponent.java
package com.poppmedia.wallpaperautomaton.di;import com.poppmedia.wallpaperautomaton.TestClass;import javax.inject.Singleton;import dagger.Component;@Singleton@Component(modules = { AppModule.class, TestClassModule.class })public interface TestClassComponent { TestClass getTestClass();}
TestClass.java
package com.poppmedia.wallpaperautomaton;import android.content.Context;import javax.inject.Inject;import javax.inject.Singleton;@Singletonpublic class TestClass { private Context mContext; @Inject public TestClass(Context context) { mContext = context; }}
谢谢。
答案1
小编典典在您的特定情况下,您会丢失:
@Binds Application bindApplication(App app);
这很重要,因为dagger.android将自动包含
对特定Application,Activity,Fragment,Service,BroadcastReceiver等子类 的绑定 , 但不包含对
一般对象 的绑定。(您可以注入 App 而不注入 Application ,并注入 YourActivity 而不注入 Activity
。)如果要指示dagger.android使用应用程序实例应满足对Application的请求,则必须包含上述绑定。
一般而言,对于Application,Activity,Service和BroadcastReceiver而言,这是一件相当安全的事情,但对于Fragment(本机或在compat库中)而言则不是。这是因为dagger.android尊重嵌套片段,在这种情况下,要插入哪个片段将是模棱两可的。
尽管您可以通过luffy的答案中的Module和instance字段提供Application
,但这比您需要的样板好,而且优化程度也较低:Dagger将编写代码来调用您的@Provides
方法,而您可以声明性地告诉Dagger重用现有的代码使用@Binds
或编写static@Provides
避免在实例上调用调用的方法进行绑定。
参见Dagger的优势@Binds
和Android静态调度的优势。
今天关于来自QWidget的“必须在QPaintDevice之前构造一个QApplication”的分享就到这里,希望大家有所收获,若想了解更多关于android – ApplicationStatus类E / SysUtils:ApplicationStat中的ApplicationContext为null、android – “必须在此操作中指定至少一个ID字段(installationId,deviceToken)”解析、ApplicationListener ApplicationContextAware ApplicationEvent使用、dagger2错误“没有@Inject构造函数或@Provides注释方法无法提供android.app.Application”等相关知识,可以在本站进行查询。
本文标签: