2017-01-22 6 views
1

Когда я нажимаю на элемент параметра, цикл for будет первым, а после завершения цикла for будет установлен текст кнопки. Почему он установлен ПОСЛЕ цикла for, когда он запускается до цикла for?Settext не вызывается, пока он вызывается перед циклом FOR

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.refresh) { 
     Button button = (Button) findViewById(R.id.button); 
     button.setText("Running"); 
     Toast.makeText(MainActivity.this, "We are currently running this function", Toast.LENGTH_SHORT).show(); 

     for (int i = 0; i < 100; i++) { 
      try { 
       System.out.println("For is running" + i); 
      } catch (NullPointerException e) { 
       //Don't do shit :) 
      } 
     } 
    } 
} 
+0

в этом случае его возвращение 'true' после цикла исполняющего –

ответ

1

Ваша проблема заключается в том, что вы остановите поток пользовательского интерфейса внутри цикла. Он установит текст на уровне объекта кнопки, но остановится, пока это не будет отражено в пользовательском интерфейсе. Если вы хотите выполнить какой-то код, который занимает какое-то время, вы всегда должны использовать фоновое действие. Примеры см., Например, «https://developer.android.com/reference/android/os/AsyncTask.html».

+0

Привет, пожалуйста, см мой выбор. Убрал сон, так как это было просто немного задержать, чтобы вы могли увидеть, что цикл for занимает некоторое время. – Jason

0

1) Во-первых, метод public boolean onOptionsItemSelected (ItemItem item) ждет, пока вы не отправите обратно логическое значение. Я не буду показывать вашу кнопку, пока вы не вернетесь.
2) Во-вторых, это очень плохая идея sleep() в потоке пользовательского интерфейса. Вместо этого попробуйте runOnUlThred():

public boolean onOptionsItemSelected(MenuItem item) 
{ 
    int id = item.getItemId(); 

    if (id == R.id.refresh) 
    { 
     Button button = (Button) findViewById(R.id.button); 
     button.setText("Running"); 
     Toast.makeText(MainActivity.this, "We are currently running this function", Toast.LENGTH_SHORT).show(); 

     runOnUiThread(new Runnable() 
     { 
     public void run() 
     { 
     for (int i = 0; i < 100; i++) { 
      try { 
       System.out.println("For is running" + i); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } catch (NullPointerException e) { 
       //Don't do shit :) 
      } 
     } 
     } 
     } 
    return true; 
    } 
    else return super.onOptionsItemSelected(item); 
} 
+0

Привет, см. Мое редактирование. Убрал сон, так как это было просто немного задержать, чтобы вы могли увидеть, что цикл for занимает некоторое время. – Jason

Смежные вопросы