2011-07-13 60 views
0

在我的黑莓应用程序中,我正在使用备用入口点,并在启动时运行一个线程,执行http操作,同一线程在一段时间后会重复调用3分钟。它做它的操作,但问题是它挂起UI 这里是我的代码。黑莓服务线程在执行时挂起ui

final class sendUnsentService extends Thread { 

Timer timer; 
TimerTask repeatMe; 

sendUnsentService me; 

boolean working = false; 

public boolean isWorking() { 
    return working; 
} 

public void interrupt() { 
    super.interrupt(); 

    System.out.println("___________________________[STOPSERVICE()]"); 
    try { 
     timer.cancel(); 
    } catch (Exception e) { 
     System.out 
     .println("_______________________[PROBLEM STOPPING SERVICE]"); 
    } 
} 

public void run() { 
    super.run(); 
    System.out.println("___________________________[STARTSERVICE()]"); 
    new Thread() { 
     public void run() { 
      timer.schedule(repeatMe, 0, 300000); 
     }; 
    }.start(); 
} 

public sendUnsentService() { 
    me = this; 
    ImageUtils.initPersistentStorage(); 
    timer = new Timer(); 

    repeatMe = new TimerTask() { 

     public void run() { 
      working = true; 
      if (sendUnsentActivity()) { 
       me.interrupt(); 
      } 
      working = false; 
     } 
    }; 
} 

我上一些用户交互使用此代码调用这个线程然后将其挂在UI

try { 
    helloBerry.service = new sendUnsentService(); 
} catch (Exception e) { 
System.out.println("_____________1 " + e); 
} 
try { 
    helloBerry.service.startService(); 
} catch (Exception e) { 
System.out.println("_____________2 " + e); 
} 

,这是我如何调用服务使用的替代品开始在设备启动在主方法入口点

if (args != null && args.length > 0 && args[0].equals("normal")) { 
      System.out.println("_________[STARTING APP]"); 
___________some code here to show a screen 
      } 
     } else { 
      System.out.println("_________[STARTING SERVICE]"); 
      service = new sendUnsentService(); 
      service.run(); 
     } 

回答

0

OMG!最后,我发现事情和它的那种愚蠢的问题是我用来打印我发送给服务器的数据的一些sysout语句谢谢jprofit采取的兴趣

我有另一个相关的问题,如果你可以回答我开始这个线程在某些事件,所以当用户关闭应用程序时,它也关闭此线程我已经尝试扩展应用程序而不是线程,但我无法远程处理它。

+1

您可能不得不使用RuntimeStore将信息传递到后台应用程序进行处理,或将其存储在某个标准位置,并且当它看到它知道要开始的某些数据的存在发送。据我所知,如果用户退出应用程序没有什么可以做,以防止线程被杀害。如果传输仍在进行中,您可以重写主屏幕上的onClose()方法作为后台自身,然后在完成时自动关闭。 – jprofitt

1

我注意到的第一件事就是您从另一个线程启动TimerTask。一个Timer包含它自己的Thread,所以这是不必要的 - 直接调用它。另外,我不认为你需要让这个扩展一个线程。你可能想要做的是使用TimerTask重新安排自己,如果它没有错误,否则就让它停止。

就锁定UI而言,除非在RuntimeStore上做了一些奇怪的同步操作,否则这不会影响您的主程序。它应该作为两个独立的进程运行,彼此不知道。什么情况下会冻结?

+0

就调度计时器的事情达成一致,我补充说只是一个尝试。这个应用程序的需求是一个后台服务,它将启动设备启动并在http上发送一些数据给服务器,它被称为sendUnsentActivity(),如果成功,它将返回true,以便我们停止服务。而且我还需要由用户在特定事件中再次启动它,并且该时间冻结了用户界面并保持这种状态,直到它完成其工作。无论如何感谢回复 –

+0

你是否在按需调用时直接调用'sendUnsentActivity()',或者将它封装在自己的Thread中? – jprofitt

+0

看到我刚刚添加了该问题块 –