Qual é a diferença entre shouldShowRequestPermissionRationale e requestPermissions?

Estou criando um aplicativo que requer a localização do usuário. Estou seguindo a documentação de treinamento do Android emaqui que diz:

shouldShowRequestPermissionRationale retornar o booleano indicando se devemos ou não mostrar a interface do usuário com razão para solicitar uma permissão (permissão perigosa, ACCESS_FINE_LOCATION)

Agora neste código (extraído da própria documentação):

if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

[MY DÚVIDA] Esta parte do código não deve (abaixo)

ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

estar dentro da condição 'if' aqui ..

 if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {
    //HERE .....

}

Quero dizer, se

ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)   

é verdade, precisamos mostrar a interface do usuário e mostraremos a interface

ActivityCompat.requestPermissions(thisActivity,
    newString[{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);

Por favor, explique onde estou enganado. Eu estou preso aqui. Desde já, obrigado. Um exemplo seria muito apreciado.

Nota: é claro que estou executando meu aplicativo no Android M e meu sdk de destino é> = 23.

questionAnswers(3)

yourAnswerToTheQuestion