2011-07-13 59 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

看到我剛剛添加了該問題塊 –