【发布时间】:2018-02-26 05:05:18
【问题描述】:
所以问题是我想为我的作业模仿冒泡排序算法的过程。我想要这样做的方式是 - 播放第一个淡出动画,然后停止我的 for 循环,等到动画完成,重新分配值,播放第二个动画,等到它完成并恢复 for 循环。我找到了Thread.sleep(),但最后我的应用程序冻结或屏幕变黑,直到所有动画都完成。我做了很多实验,所以我的代码看起来很糟糕(抱歉)。
public class BubbleSort extends AppCompatActivity {
Button element1;
Button element2;
Animation fadeIn;
Animation fadeOut;
int[] values;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bubble_sort);
fadeIn = AnimationUtils.loadAnimation(getApplicationContext(),
R.anim.fade_in);
fadeOut = AnimationUtils.loadAnimation(getApplicationContext(),
R.anim.fade_out);
}
public void onSort(View view){
HashMap<Integer, Integer> indexes = sort();
Set<Integer> keySet = indexes.keySet();
Integer[] keys = keySet.toArray(new Integer[keySet.size()]);
for (int key : keys) {
initElements(key, indexes.get(key));
element1.startAnimation(fadeOut);
element2.startAnimation(fadeOut);
try {
Thread.sleep(2000);
element1.startAnimation(fadeIn);
element1.setText("" + values[key]);
element2.startAnimation(fadeIn);
element2.setText("" + values[indexes.get(key)]);
} catch (Exception e) {
Log.i("test", e.toString());
}
}
}
void initElements(int from, int to){
switch (from){
case 0:{
element1 = (Button) findViewById(R.id.element_1);
break;
}
case 1:{
element1 = (Button) findViewById(R.id.element_2);
break;
}
case 2:{
element1 = (Button) findViewById(R.id.element_3);
break;
}
case 3:{
element1 = (Button) findViewById(R.id.element_4);
break;
}
case 4:{
element1 = (Button) findViewById(R.id.element_5);
break;
}
case 5:{
element1 = (Button) findViewById(R.id.element_6);
break;
}
case 6:{
element1 = (Button) findViewById(R.id.element_7);
break;
}
case 7:{
element1 = (Button) findViewById(R.id.element_8);
break;
}
case 8:{
element1 = (Button) findViewById(R.id.element_9);
break;
}
case 9:{
element1 = (Button) findViewById(R.id.element_10);
break;
}
default:{
element1 = null;
break;
}
}
switch (to){
case 0:{
element2 = (Button) findViewById(R.id.element_1);
break;
}
case 1:{
element2 = (Button) findViewById(R.id.element_2);
break;
}
case 2:{
element2 = (Button) findViewById(R.id.element_3);
break;
}
case 3:{
element2 = (Button) findViewById(R.id.element_4);
break;
}
case 4:{
element2 = (Button) findViewById(R.id.element_5);
break;
}
case 5:{
element2 = (Button) findViewById(R.id.element_6);
break;
}
case 6:{
element2 = (Button) findViewById(R.id.element_7);
break;
}
case 7:{
element2 = (Button) findViewById(R.id.element_8);
break;
}
case 8:{
element2 = (Button) findViewById(R.id.element_9);
break;
}
case 9:{
element2 = (Button) findViewById(R.id.element_10);
break;
}
default:{
element2 = null;
break;
}
}
}
HashMap<Integer, Integer> sort(){
HashMap<Integer, Integer> indexes = new HashMap<>();
values = new int[10];
boolean sorting = true;
int loop = 1;
Random random = new Random();
for (int index = 0; index < values.length; index++){
values[index] = random.nextInt(10);
}
int offset = 0;
while (sorting){
System.out.println("To sort:");
for (int element : values)
System.out.print(" " + element);
System.out.println();
sorting = false;
for (int index = 0; index < values.length - 1 - offset; index++) {
if (values[index] > values[index + 1]) {
int temp = values[index];
values[index] = values[index + 1];
values[index + 1] = temp;
sorting = true;
indexes.put(index, index + 1);
}
}
System.out.println("Loop: " + loop);
for (int element : values)
System.out.print(" " + element);
System.out.println();
loop++;
offset++;
}
return indexes;
}
}
【问题讨论】:
-
如果你让你的主线程休眠,那意味着你的应用程序当然会冻结。