如何在Android中每秒在后台调用一段代码



我想每秒调用以下部分代码??我尝试了以下方法-但是不知道如何每秒打电话??

我怎样才能继续调用新的checkNWConnectivity().execute("Test"); 每一秒,从哪里调用我的安卓程序???

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...参数) { ... }

你想使用 ScheduledExecutorService

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(command, initialDelay, period, unit);
创建执行

程序 On创建活动,在恢复时启动执行,并在暂停时停止执行。

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

您可以使用

TimerTask,Timer and a 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
    }
  1. 从您的代码来看,您似乎正在尝试显示网络状态。轮询信息不是一个好主意。最好使用广播接收器来侦听网络状态的变化。检查以下问题: Android - 网络状态广播接收器未接收意图,网络状态更改时的广播意图
  2. 如果必须执行定期操作,可以使用Timer
起初,

您无法使用来自非 UI 线程的视图,因此无法从AsyncTask.doInBackground方法调用TextView.setText。您可以简单地使用 Handler 并使用 Handler.sendMessageDelayed 每秒提交一条消息

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

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

然后是操作 UI 线程的困境。我在服务中的循环将编辑共享首选项中的一个变量,我的活动有一个循环检查共享首选项,如果共享首选项返回某个值,则会更新 UI 对象,问题解决了。

您可以使用广播接收器执行类似操作

使用处理程序。

    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);

最新更新