2011-07-13 9 views
0

私のブラックベリーアプリでは、別のエントリポイントを使用しており、http操作を実行するスレッドを実行しています。それはその操作を行いますが、問題はそれが私のコードですuu をハングアップされます。ブラックベリーのサービススレッドは、実行時に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); 
} 

をハングアップし、これは私が代替を使用してmainメソッドでは、デバイスの起動時に起動するようにサービスを呼び出す方法ですエントリポイント

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文でした。興味を持っていただきありがとうございました。

私は、私はいくつかのイベントでこのスレッドを開始しているので、ユーザーがアプリケーションを閉じるときにもこのスレッドを閉じることができます。スレッドの代わりにアプリケーションを拡張しようとしましたが、リモートで処理できませんでした。

+1

RuntimeStoreを使って情報をバックグラウンドアプリに渡して処理するか、標準的な場所に保存する必要があるかもしれませんし、開始することがわかっているデータ送信。あなたが知っている限り、ユーザーがアプリケーションを終了すると、スレッドが強制終了されないようにすることはできません。代わりに、メイン画面のonClose()メソッドをオーバーライドして、転送がまだ進行中の場合はバックグラウンドにし、完了したら終了することもできます。 – jprofitt

1

最初に気づくのは、別のスレッドからTimerTaskを開始していることです。タイマーには独自のスレッドが含まれているため、これは不要です。直接呼び出してください。また、私はこれをスレッドに拡張する必要はないと思います。あなたがやりたいことは、TimerTaskを使用してエラーが発生していない場合はそれを再スケジュールし、それ以外の場合は停止させます。

UIをロックする限り、RuntimeStoreで奇妙な同期を行っていない限り、これはメインプログラムに影響しません。お互いに気づかずに、2つの別個のプロセスとして実行する必要があります。どのような状況で凍結されますか?

+0

私はちょうど試しにそれを追加したことをタイマの事柄に同意した。このアプリケーションの必要条件は、デバイスの起動時に開始され、sendUnsentActivity()として呼び出されるコードでhttpのサーバーにデータを送信するバックグラウンドサービスで、サービスが停止するとtrueを返します。私はまた、ユーザーによって特定のイベントで再びそれを開始する必要があり、その時間がそれを凍結し、その作業を終えるまでそのようにとどまります。とにかくお返事ありがとうございます –

+0

オンデマンドコールを行うときに 'sendUnsentActivity()'を直接呼び出しているのですか、それとも独自のスレッドでラップしていますか? – jprofitt

+0

私はそのブロックを追加したばかりです –

関連する問題