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

您可以使用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

    }
于 2012-10-15T13:55:57.480 回答
1
  1. 从您的代码来看,您似乎正在尝试显示网络状态。轮询信息不是一个好主意。最好使用 BroadcastReceiver 来监听网络状态的变化。检查这些问题:Android - Network State broadcast receiver does not receive intent , Broadcast Intent when network state has changed
  2. 如果您必须执行定期操作,您可以使用Timer
于 2012-10-15T13:55:38.527 回答
0

起初你不能使用来自非 UI 线程的视图,所以你不能TextView.setTextAsyncTask.doInBackground方法调用。您可以简单地使用Handler并使用每秒提交一条消息Handler.sendMessageDelayed

于 2012-10-15T13:52:14.810 回答
0

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

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

然后是操纵UI线程的困境。我在服务中的循环将编辑 SharedPreferences 中的一个变量,并且我的 Activity 有一个循环检查 SharedPreferences 并在 SharedPreferences 返回某个值时更新 UI 对象,问题已解决。

您也许可以对广播接收器做类似的事情

于 2012-10-15T13:54:50.277 回答
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 回答