我正在使用Google Analytics for Android来跟踪Android应用上的活动和网页浏览量.调用跟踪器的调度方法时,我收到一个RuntimeException:
07-12 18:02:05.594: WARN/MessageQueue(12823): Handler{44a08620} sending message to a Handler on a dead thread
07-12 18:02:05.594: WARN/MessageQueue(12823): java.lang.RuntimeException: Handler{44a08620} sending message to a Handler on a dead thread
07-12 18:02:05.594: WARN/MessageQueue(12823): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:179)
07-12 18:02:05.594: WARN/MessageQueue(12823): at android.os.Handler.sendMessageAtTime(Handler.java:457)
07-12 18:02:05.594: WARN/MessageQueue(12823): at android.os.Handler.sendMessageDelayed(Handler.java:430)
07-12 18:02:05.594: WARN/MessageQueue(12823): at android.os.Handler.post(Handler.java:248)
07-12 18:02:05.594: WARN/MessageQueue(12823): at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread.dispatchEvents(Unknown Source)
07-12 18:02:05.594: WARN/MessageQueue(12823): at com.google.android.apps.analytics.NetworkDispatcher.dispatchEvents(Unknown Source)
07-12 18:02:05.594: WARN/MessageQueue(12823): at com.google.android.apps.analytics.GoogleAnalyticsTracker.dispatch(Unknown Source)
07-12 18:02:05.594: WARN/MessageQueue(12823): at com.company.activity.set(MyActivity.java:177)
07-12 18:02:05.594: WARN/MessageQueue(12823): at com.company.activity.access$34(MyActivity.java:175)
07-12 …Run Code Online (Sandbox Code Playgroud) 我有一个4x4小部件,我想每15-20秒更新一小部分.显然,我不希望在手机处于待机状态时更新它.小部件还需要响应除我的计时器之外的一些系统事件.那么,哪个是最佳选择?
我还需要更新我的小部件的一小部分而不更新它的所有屏幕区域,这可能吗?
谢谢大家.
在组合一个简单的"时钟"应用程序时,我发现Android要求你使用生活在线程A中的android.os.Handler来更新线程A中的View对象,其中包含来自线程B的数据结果.
我还是比较新的Java,这是我以前第一次明确处理Threads,但我知道如果两个不同的线程想要访问相同的数据,通常会将方法和/或操作声明为synchronized .但是看起来android.os.Handler是一种特定于Android的线程之间同步数据的方式,这样你就可以避免我刚刚链接到的Oracle文档中详述的经典 并发错误.这是真的吗?
如果我发现自己的情况是Android操作系统要求我使用android.os.Handler将数据从一个线程传送到另一个线程,这是否意味着我不必声明用于派生该方法的方法数据同步?
我需要从处理线程制作一个Android toast,这是OpenCV的自定义,所以我不能像这里建议的那样使用runOnUiThread(): Android:在一个线程中Toast.
大部分代码来自CVCamera示例应用程序.但是那些不熟悉的,当我选择Surf菜单按钮时,SURFProcessor就像这样调用:
else if (item.getTitle().equals("SURF")) {
defaultcallbackstack.addFirst(new SURFProcessor());
toasts(DIALOG_TUTORIAL_SURF, "");
}
Run Code Online (Sandbox Code Playgroud)
运行此处理器线程,以便当我按下手机的相机按钮(capturePress = true)时,将拍摄图像并完成处理.我想调用toasts方法如图所示:
class SURFProcessor implements NativeProcessor.PoolCallback {
@Override
public void process(int idx, image_pool pool, long timestamp,
NativeProcessor nativeProcessor) {
if(capturePress) {
String processMsg = processor.processFeatures(idx, pool, cvcamera.DETECT_SURF);
capturePress = false;
toasts(PROCESS_MESSAGE, processMsg);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是toasts方法,位于主类扩展Activity:
void toasts(int id, String msg) {
switch (id) {
case PROCESS_MESSAGE:
Toast.makeText(MMRapp.this, msg, Toast.LENGTH_LONG).show();
break;
.........
Run Code Online (Sandbox Code Playgroud)
现在这段代码给了我一个错误:"无法在没有调用Looper.prepare()的线程内创建处理程序." 如何调用toasts方法?或者是否可以让toasts方法监听processMsg中的更改?如果可能的话,我可以通过发送processMsg或改变类变量来实现.本质上,我需要从此处理器线程更新的String.
非常感谢,如果需要,我会提供更多信息/代码.
-Tom
我有以下简单的处理程序(为vissibilty sakes删除了一些代码,但是下面的代码仍然失败)
<%@ WebHandler Language="C#" Class="DownloadHandler" %>
using System;
using System.Web;
public class DownloadHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (context.Session["t1"] != "true")
{
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
该行if (context.Session["t1"] != "true")失败,"对象引用未设置为对象的实例".我不明白为什么会这样?
在Java util日志记录中,我在init()上启动处理程序,并在destroy()处关闭处理程序,它完全正常:创建了一个日志文件等.如果用户正常刷新页面,它仍然只创建一个日志文件.
但是,如果用户快速刷新applet的页面几次,看起来似乎没有调用destroy()或者没有完成任务,并且因为init()再次被调用,它会假定前一个文件仍然被锁定并创建一个新的日志文件.
我试图使用destroy()和finalize()来关闭处理程序,但它不起作用.任何人都知道如何解决这个问题?
另一个小问题是:如果init()尚未完成并且页面被刷新,实际发生了什么.它是否会继续这个过程并最终导致调用destroy()或它是否只是停在那里?
我正在尝试实现从不同线程监听同一个Looper的Handler.
下面我有两个处理程序,一个在主线程中创建,另一个在子线程中,但是两个都初始化为侦听Main Looper.
private Handler mMain;
public static final ThreadPoolExecutor tpe =
(ThreadPoolExecutor) Executors.newCachedThreadPool();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMain = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
Log.wtf("", "main:" + msg);
}
};
tpe.execute(new Runnable() {
private Handler tChild = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
Log.wtf("", "child:" + msg);
}
};
@Override
public void run() {
Log.wtf("", "send msg to main looper");
tChild.sendEmptyMessage(100);
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是当我发送如下消息时,只有子处理程序打印消息.主处理程序不接收消息.
03-20 22:02:26.754: A/(12857): …Run Code Online (Sandbox Code Playgroud) 在开发eclipse插件时,我在带有id crtc_v4.session的Manifest扩展中使用默认处理程序crtc_v4.handlers.StartSession创建了一个命令,我在清单中为此命令添加了一个处理程序,此处理程序根据变量crtc_v4.sessionvar启用命令.
控制台上出现的问题是:
!MESSAGE Conflicting handlers for crtc_v4.session: {crtc_v4.handlers.StartSession@98bc5c} vs {crtc_v4.handlers.StartSession@1265d09}
Run Code Online (Sandbox Code Playgroud)
但它不会阻止运行插件.我问的是这个问题的解决方案,以及它是否会影响我的插件的性能?
编辑:
定义命令的代码段:
<extension
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar
id="crtc_v5.crtctoolbar">
<command
commandId="crtc_v5.session"
icon="icons/neutral.png"
label="Start Session"
style="push">
</command>
</toolbar>
</menuContribution>
Run Code Online (Sandbox Code Playgroud)
定义处理程序的代码段:
</extension>
<command
defaultHandler="crtc_v5.handlers.StartSession"
id="crtc_v5.session"
name="session">
</command>
</extension>
Run Code Online (Sandbox Code Playgroud)
这是对sessionvar的启用:
<extension
point="org.eclipse.ui.handlers">
<handler
class="crtc_v5.handlers.StartSession"
commandId="crtc_v5.session">
<enabledWhen>
<with
variable="crtc_v5.sessionvar">
<equals
value="LOGGEDIN">
</equals>
</with>
</enabledWhen>
</handler>
Run Code Online (Sandbox Code Playgroud)
我遇到的情况类似于未调用的未捕获异常处理程序,但他是Mac应用程序,而我是iOS应用程序。解决方案是使用ExceptionHandler框架,但是在iOS上不可用。
我有一个全新的iOS单视图应用程序,它只有几行代码,所以我不会粘贴整个文件。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&handler);
@throw NSInternalInconsistencyException;
return YES;
}
void handler()
{
NSLog(@"hello world");
}
Run Code Online (Sandbox Code Playgroud)
因此,didFinishLaunchingWithOptions我设置了自定义异常处理程序,然后强制崩溃。然后将异常处理程序打印hello world到控制台,但这不会发生。在处理程序中放置断点表明执行未进入方法。但是无论如何,异常都会打印到控制台(默认操作)。
2014-07-24 08:58:25.476 Exception[430:70b] *** Terminating app due to uncaught exception of class '__NSCFConstantString'
libc++abi.dylib: terminating with uncaught exception of type __NSCFConstantString
Run Code Online (Sandbox Code Playgroud)
我的处理程序在某处之后是否可以默认设置另一个异常处理程序?
更新
我决定将强制崩溃的方式从更改NSInternalInconsistencyException为[[NSArray arrayWithObject:@"object"] objectAtIndex:1];。现在将调用该处理程序并将hello world其打印到控制台。
所以现在的问题是,为什么没有NSINternalInconsistencyException导致处理程序被调用?错误略有不同:
2014-07-24 10:13:51.333 Exception[1474:70b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** …Run Code Online (Sandbox Code Playgroud) 我想将Monra日志从我的Laravel 5.1应用程序发送到Loggly.com在线日志管理服务.从所有可能的环境,包括当地的发展.