对于循环使用Thread.Sleep跳过两次迭代

时间:2016-01-13 12:04:33

标签: java android multithreading

我制作了一个Android应用程序,它只调用你输入的数字范围。 从您输入的起始编号开始,并以您输入的“完成”编号结束。响铃7秒后,应用程序会自动挂断。 代码如下。

public void onClick(View view){

    EditText starte = (EditText) findViewById(R.id.start);
    EditText finishe = (EditText) findViewById(R.id.finish);
    EditText prefixes = (EditText) findViewById(R.id.prefixes);

    String prefix = prefixes.getText().toString();
    /** Get Telephone number String **/
    int startOriginal = Integer.parseInt(starte.getText().toString());
    int finish = Integer.parseInt(finishe.getText().toString());

    for (int start = startOriginal; start<=finish; start++) {

        startCall(prefix, Integer.toString(start));

        try {
            Thread.sleep(7000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }


    }

    new CallUtilities("endcall");
}

private void startCall(String prefix, String nr){

    Intent intent = new Intent("android.intent.action.CALL");

    Uri data = Uri.parse("tel:"+ prefix + nr);

    /** Setting intent data */
    intent.setData(data);

    /** Starting the caller activity by the implicit intent */
    startActivity(intent);
}

CallUtilities类是我写的,只是通过反射方法结束调用。现在我的问题是,当你输入一个起始编号和一个完成编号时,应用程序似乎总是调用例如1的第一个数字,然后挂起它直接到3然后再到4和5等等就像它应该做的那样。什么是错的? 还有可能在这里使用DisconnectCause来解决断开连接过早挂断的原因吗? 提前谢谢!

1 个答案:

答案 0 :(得分:2)

这是灾难的秘诀。原因有几个。

你是(假设{1}}在UI线程上运行)试图睡眠UI线程。

如果UI线程挂起超过5秒,则会导致ANR。

此外,您似乎正在尝试同时启动多个活动。这当然不是设计应用程序的正确方法。

更不用说使用Reflection访问核心Android组件来结束通话。这可能会在将来导致您的应用程序出现问题。

我对多个活动/睡眠问题的建议:

  1. 删除循环
  2. 存储下一个尝试的号码
  3. 运行呼叫功能
  4. onActivityResult中,您可以确定下一个要尝试的号码
  5. 转到2.(确保包含结束条件!