使用 Handler() 打破 For 循环
Breaking For loop with Handler()
当 1 个验证 return 为真时,如何打破 for() loop
。
public void printOut (){
final Handler handler = new Handler();
for (final int[] x = {0}; x[0] < Integer.parseInt(spinner.getSelectedItem.toString()); x[0]++) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
//printer for my device
int query = PrinterInterface.queryStatus();
if (query == 1){
// return true
//printing goes here..
}else{
// returns false
x[0] = Integer.parseInt(spinner.getSelectedItem.toString());
}
}
},2000 * x[0]);
}
}
这是我的代码 ATM,如果 query
值 return 不等于 1,它将继续执行 else 语句并使变量 x[0]
等于Spinner
。但问题是它仍在循环。我怎样才能让它停止?谢谢!
更新
我找到问题了。它在 }, 2000 * loopVariable[0]);
我怎么能打断这部分?。或停止 Handler()
你必须为 handle canceled
status
创建 var
例如,通过您的代码。
public void printOut (){
final Handler handler = new Handler();
boolean isCanceled = false
for (final int[] x = {0}; (x[0] < Integer.parseInt(spinner.getSelectedItem.toString()) && !isCanceled); x[0]++) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
//printer for my device
int query = PrinterInterface.queryStatus();
if (query == 1){
isCanceled = true
// return true
//printing goes here..
}else{
// returns false
x[0] = Integer.parseInt(spinner.getSelectedItem.toString());
}
}
},2000 * x[0]);
}
而且,如果你想处理结果,你需要添加回调。
但是,我不明白,为什么你使用 poseDelayed
,在 for
中你启动了所有处理程序。
更好,如果你检查query
,然后执行逻辑进入Handler
我不知道你为什么在 for
中使用 handler
,如果你的打印代码需要后台处理并更新 UI 尝试使用 AsyncTask,它有doInBackground
、onProgressUpdate
和 onPostExecute
这样您就可以更高效地处理代码。
我修好了!解决方案只有一行代码-_-,我还为Runnable
添加了一个变量。特别感谢 pskink 的帮助。
public void printOut (){
final Handler handler = new Handler();
for (final int[] x = {0}; x[0] < Integer.parseInt(spinner.getSelectedItem.toString()); x[0]++) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
//printer for my device
int query = PrinterInterface.queryStatus();
if (query == 1){
// return true
//printing goes here..
}else{
// returns false
x[0] = Integer.parseInt(spinner.getSelectedItem.toString());
handler.removeCallbacksAndMessages(null);
}
}
},2000 * x[0]);
}
当 1 个验证 return 为真时,如何打破 for() loop
。
public void printOut (){
final Handler handler = new Handler();
for (final int[] x = {0}; x[0] < Integer.parseInt(spinner.getSelectedItem.toString()); x[0]++) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
//printer for my device
int query = PrinterInterface.queryStatus();
if (query == 1){
// return true
//printing goes here..
}else{
// returns false
x[0] = Integer.parseInt(spinner.getSelectedItem.toString());
}
}
},2000 * x[0]);
}
}
这是我的代码 ATM,如果 query
值 return 不等于 1,它将继续执行 else 语句并使变量 x[0]
等于Spinner
。但问题是它仍在循环。我怎样才能让它停止?谢谢!
更新
我找到问题了。它在 }, 2000 * loopVariable[0]);
我怎么能打断这部分?。或停止 Handler()
你必须为 handle canceled
status
例如,通过您的代码。
public void printOut (){
final Handler handler = new Handler();
boolean isCanceled = false
for (final int[] x = {0}; (x[0] < Integer.parseInt(spinner.getSelectedItem.toString()) && !isCanceled); x[0]++) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
//printer for my device
int query = PrinterInterface.queryStatus();
if (query == 1){
isCanceled = true
// return true
//printing goes here..
}else{
// returns false
x[0] = Integer.parseInt(spinner.getSelectedItem.toString());
}
}
},2000 * x[0]);
}
而且,如果你想处理结果,你需要添加回调。
但是,我不明白,为什么你使用 poseDelayed
,在 for
中你启动了所有处理程序。
更好,如果你检查query
,然后执行逻辑进入Handler
我不知道你为什么在 for
中使用 handler
,如果你的打印代码需要后台处理并更新 UI 尝试使用 AsyncTask,它有doInBackground
、onProgressUpdate
和 onPostExecute
这样您就可以更高效地处理代码。
我修好了!解决方案只有一行代码-_-,我还为Runnable
添加了一个变量。特别感谢 pskink 的帮助。
public void printOut (){
final Handler handler = new Handler();
for (final int[] x = {0}; x[0] < Integer.parseInt(spinner.getSelectedItem.toString()); x[0]++) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
//printer for my device
int query = PrinterInterface.queryStatus();
if (query == 1){
// return true
//printing goes here..
}else{
// returns false
x[0] = Integer.parseInt(spinner.getSelectedItem.toString());
handler.removeCallbacksAndMessages(null);
}
}
},2000 * x[0]);
}