如何在Android中每秒在后台调用一段代码
我想每秒调用以下代码部分?? 我试过以下方法- 但我不知道如何每一秒都打电话 如何继续调用new checkNWConnectivity().execute(“Test”)每秒钟从哪里调用我的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...
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。它起作用了。但当我在后台开始另一项工作时,这项工作就停止了,当这项工作完成后,它又开始工作了。我想让这个背景工作继续下去。这怎么可能?我们不能同时运行两个后台作业,可能是通过不同的线程??检查此链接:…希望它有助于解决您的问题。它起作用了。但当我在后台开始另一项工作时,这项工作就停止了,当这项工作完成后,它又开始工作了。我想让这个背景工作继续下去。这怎么可能?我们不能同时运行两个后台作业,可能是通过不同的线程??检查此链接:…希望它有助于解决您的查询