Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中每秒在后台调用一段代码_Android_Android Intent - Fatal编程技术网

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

如何在Android中每秒在后台调用一段代码,android,android-intent,Android,Android Intent,我想每秒调用以下代码部分?? 我试过以下方法- 但我不知道如何每一秒都打电话 如何继续调用new checkNWConnectivity().execute(“Test”)每秒钟从哪里调用我的android程序 private class checkNWConnectivity extends AsyncTask<String, Integer, String> { @Override protected String doInBackground(String...

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

如何继续调用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;
    }

}
私有类checkNWConnectivity扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
ConnectivityManager=(ConnectivityManager)getSystemService(MainActivity.CONNECTIVITY_服务);
//3G确认
布尔值is3g=manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
//无线确认
布尔值isWifi=manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
如果(is3g){
tvNWConnectivity.setText(“连接到3G”);
}否则,如果(iWiFi){
tvNWConnectivity.setText(“连接到wifi”);
}否则{
String text=“无网络连接。“+”\n“+”将从streamlet“+CountStreamletUpload.toString()恢复上载;
tvNWConnectivity.setText(文本);
}    
返回null;
}
}
所以我的问题是如何每秒调用它?
实际上,我想继续运行doInBackground(String…params){…}中的代码部分首先,您不能从非UI线程处理视图,因此您不能从
AsyncTask.doInBackground
方法调用
TextView.setText
。您只需使用
处理程序每秒使用并提交一条消息。sendMessageDelayed

开始时,您无法从非UI线程处理视图,因此无法从
AsyncTask.doInBackground
方法调用
TextView.setText
。您只需使用
处理程序每秒使用并提交一条消息。sendMessageDelayed

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

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

然后是操作UI线程的两难选择。服务中的我的循环将编辑SharedReferences中的一个变量,我的活动有一个检查SharedReferences的循环,如果SharedReferences返回某个值,我将更新UI对象,问题解决了


您可能可以对广播接收器执行类似的操作,我这样做的方式是将线程放入服务中

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

然后是操作UI线程的两难选择。服务中的我的循环将编辑SharedReferences中的一个变量,我的活动有一个检查SharedReferences的循环,如果SharedReferences返回某个值,我将更新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);
使用处理器

    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);
  • 从您的代码来看,似乎您正在尝试显示网络状态。进行民意调查以获取信息不是一个好主意。最好使用广播接收器来监听网络状态的变化。检查以下问题:
  • 如果必须执行定期操作,可以使用
  • 从您的代码来看,似乎您正在尝试显示网络状态。进行民意调查以获取信息不是一个好主意。最好使用广播接收器来监听网络状态的变化。检查以下问题:
  • 如果必须执行定期操作,可以使用
  • 您可以使用和来执行此操作:

     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
    
        }
    
    您可以使用和来执行此操作:

     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
    
        }
    

    您想使用ScheduledExecutorService

    ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(command, initialDelay, period, unit);
    
    在创建活动时创建executor,在Resume时开始执行,在Pause时停止执行


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

    是否要使用ScheduledExecutorService

    ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(command, initialDelay, period, unit);
    
    在创建活动时创建executor,在Resume时开始执行,在Pause时停止执行


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

    谢谢Parth。它起作用了。但当我在后台开始另一项工作时,这项工作就停止了,当这项工作完成后,它又开始工作了。我想让这个背景工作继续下去。这怎么可能?我们不能同时运行两个后台作业,可能是通过不同的线程??检查此链接:…希望它有助于解决您的问题。它起作用了。但当我在后台开始另一项工作时,这项工作就停止了,当这项工作完成后,它又开始工作了。我想让这个背景工作继续下去。这怎么可能?我们不能同时运行两个后台作业,可能是通过不同的线程??检查此链接:…希望它有助于解决您的查询