如何在Android背景中每秒调用一段代码

时间:2012-10-15 13:38:26

标签: android android-intent

我想每秒调用以下代码部分? 我试过以下 - 但是不知道怎么称呼每一秒?

如何继续调用新checkNWConnectivity()。执行(“测试”); 每秒以及从哪里调用我的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){...}

6 个答案:

答案 0 :(得分:3)

您想使用ScheduledExecutorService

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

创建活动的执行者OnCreate,开始执行onResume并将其停在onPause。

然后您可以调用runOnUiThread(action);将操作发布回UI。

答案 1 :(得分:1)

  1. 从您的代码中,您似乎正在尝试显示网络状态。轮询信息不是一个好主意。最好使用BroadcastReceiver来监听网络状态的变化。请检查以下问题:Android - Network State broadcast receiver does not receive intentBroadcast Intent when network state has changend
  2. 如果您必须执行定期操作,则可以使用Timer

答案 2 :(得分:1)

您可以使用TimerTaskTimerHandler来执行此操作:

 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

    }

答案 3 :(得分:0)

首先,您无法使用非UI线程中的视图,因此无法从TextView.setText方法调用AsyncTask.doInBackground。您只需使用Handler并使用Handler.sendMessageDelayed

每秒提交一条消息

答案 4 :(得分:0)

我这样做的方法是将线程放在服务

该服务会从一个非常大的数字做一个倒数计时器,所以它永远不会变为零,但这只是我的应用程序的一个用例,你可能需要一些永远的东西

然后存在操纵UI线程的困境。我在服务中的循环将编辑SharedPreferences中的变量,我的Activity有一个循环检查SharedPreferences,如果SharedPreferences返回一定值,则会更新UI对象,问题解决了。

您可以使用广播接收器做类似的事情

答案 5 :(得分: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);