1

コードの次の部分を毎秒呼び出したいですか?? 私は次のことを試しました-しかし、毎秒呼び出す方法がわかりません??

new checkNWConnectivity().execute("Test");を呼び出し続けるにはどうすればよいですか 。 毎秒、どこから私のAndroidプログラムを呼び出すのですか???

private class checkNWConnectivity extends AsyncTask<String, Integer, String> {
    @Override
    protected String doInBackground(String... params) {


                ConnectivityManager manager = (ConnectivityManager)getSystemService(MainActivity.CONNECTIVITY_SERVICE);

                //  3G confirm
                Boolean is3g = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();

                // wifi confirm 
                Boolean isWifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();

                if(is3g){
                    tvNWConnectivity.setText("   Connected to 3G");
                }else if(isWifi){
                    tvNWConnectivity.setText("   Connected to wifi");
                }else{
                    String text = "   No Network Connectivity."+"\n" + "   Uploading will be resumed from streamlet "+countStreamletUploaded.toString();
                    tvNWConnectivity.setText(text);
                 }    


        return null;
    }

}

だから私の質問は、毎秒それを呼び出す方法ですか? 実際には、doInBackground(String... params) { ... } のコードの一部を実行し続けたいと考えています。

4

6 に答える 6

3

ScheduledExecutorService を使用したい

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(command, initialDelay, period, unit);

アクティビティのエグゼキュータ OnCreate を作成し、onResume で実行を開始し、onPause で停止します。

runOnUiThread(action);その後、UI にポスト アクションを呼び出すことができます。

于 2012-10-15T13:57:42.953 に答える
2

これを行うには、 TimerTaskTimer、およびHandlerを使用できます。

 public void toCallAsynchronous() {

   TimerTask doAsynchronousTask;
   final Handler handler = new Handler();
   Timer timer = new Timer();

   doAsynchronousTask = new TimerTask() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                handler.post(new Runnable() {
                    public void run() {
                        try {
                          checkNWConnectivity performBackgroundTask = new checkNWConnectivity();
                          performBackgroundTask.execute();

                           } catch (Exception e) {
                              // TODO Auto-generated catch block
                           }

                     }
                });
                timer.schedule(doAsynchronousTask, 0,30000); //put the time you want

    }
于 2012-10-15T13:55:57.480 に答える
1
  1. コードから、ネットワークの状態を表示しようとしているようです。情報をポーリングすることはお勧めできません。BroadcastReceiver を使用して、ネットワーク状態の変化をリッスンすることをお勧めします。次の質問を確認してください: Android - ネットワーク状態ブロードキャスト レシーバーがインテントを受信しない、ネットワーク状態が変更されたときにブロードキャスト インテント
  2. 定期的な操作を実行する必要がある場合は、Timer
于 2012-10-15T13:55:38.527 に答える
0

私がこれを行った方法は、スレッドをサービスに入れることでした

サービスは非常に大きな数からカウントダウンタイマーを実行するため、ゼロになることはありませんが、それは私のアプリの単なるユースケースであり、永遠に続くものが必要になる場合があります

次に、UI スレッドを操作するというジレンマがあります。サービスの私のループは SharedPreferences の変数を編集し、私のアクティビティはループで SharedPreferences をチェックし、SharedPreferences が特定の値を返した場合に UI オブジェクトを更新し、問題は解決しました。

放送受信機でも同様のことができるかもしれません

于 2012-10-15T13:54:50.277 に答える
0

最初は非 UI スレッドからのビューを操作できないため、メソッドTextView.setTextから呼び出すことはできませんAsyncTask.doInBackground。単純にHandlerを使用し、次を使用して毎秒メッセージを送信できますHandler.sendMessageDelayed

于 2012-10-15T13:52:14.810 に答える
0

ハンドラーを使用します。

    private class MyHandler extends Handler{
        @Override
        public void handleMessage(Message message){

            YourAsyncTask task = new YourAsyncTask(...);
            task.execute();
                    this.sendMessageDelayed(new Message(), 1000);}
}

次に、開始したいときにこれを行うだけです

MyHandler handler = new MyHandler();
handler.sendMessageDelayed(new Message(), 1000);
于 2012-10-15T13:55:37.577 に答える