我想每秒调用以下部分代码??我尝试了以下方法-但是不知道如何每秒打电话??
我怎样才能继续调用新的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
}
- 从您的代码来看,您似乎正在尝试显示网络状态。轮询信息不是一个好主意。最好使用广播接收器来侦听网络状态的变化。检查以下问题: Android - 网络状态广播接收器未接收意图,网络状态更改时的广播意图
- 如果必须执行定期操作,可以使用
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);