Почему-то не работает кнопка android

200
04 сентября 2018, 18:40

У меня есть приложение на андроид и почему-то, я кстати так и не понял почему, у меня не работает моя единственная кнопка, хотя все должно нормально работать я уже проверял как-бы, но при нажатии ничего не происходит. Вот мой класс mainactivity:

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.developer_4.test_login.data.model.Post;
import com.example.developer_4.test_login.data.remote.ApiUtils;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class LoginActivity extends AppCompatActivity {
    private TextView mResponseTv;
    private APIService mAPIService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        final EditText titleEt = findViewById(R.id.login);
        final EditText bodyEt = findViewById(R.id.password);
        Button submitBtn = findViewById(R.id.btn_submit);
        mResponseTv = findViewById(R.id.tv_response);
        mAPIService = ApiUtils.getAPIService();
        submitBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String a = titleEt.getText().toString().trim();
                String b = bodyEt.getText().toString().trim();
                if(!TextUtils.isEmpty(a) && !TextUtils.isEmpty(b)) {
                    sendPost(a, b);
                    logs();
                }
            }
        });
    }
    public void logs() {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://мой-сайт/v1/login/")
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        retrofit.create(APIService.class);
    }

    public void sendPost(String login, String password) {
        String a = "qwerty";
        String b = "abcdef";
        mAPIService.auth(new Post(login, password), a, b).enqueue(new Callback<Post>() {
            @Override
            public void onResponse(@NonNull Call<Post> call, @NonNull Response<Post> response) {
                if (response.isSuccessful()) {
                    showResponse(response.body().toString());
                    Toast.makeText(LoginActivity.this, "post submitted to API.", Toast.LENGTH_LONG).show();
                }
            }
            @Override
            public void onFailure(Call<Post> call, Throwable t) {
                Toast.makeText(LoginActivity.this, "Unable to submit post to API.", Toast.LENGTH_LONG).show();
            }
        });
    }
    public void showResponse(String response) {
        if (mResponseTv.getVisibility() == View.GONE) {
            mResponseTv.setVisibility(View.VISIBLE);
        }
        mResponseTv.setText(response);
    }
}

вот мой интерфейс для работы с апи:

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
import retrofit2.http.Path;
public interface APIService {
    @POST("{parameter_0}/{parameter_1}")
    Call<Post> auth(@Body Post body, @Path("parameter_0") String p0 , @Path("parameter_1") String p1);
}

apiservice.java:

import com.example.developer_4.test_login.APIService;
public class ApiUtils
{
    private ApiUtils() {}
    public static final String BASE_URL = "https://мой сайт/";
    public static APIService getAPIService() {
        return RetrofitClient.getClient(BASE_URL).create(APIService.class);
    }
}

может я не правильно настроил свой интерфейс, я уже не знаю что придумать, вот например если раньше я использовал всю информацию из этого ресурса: https://code.tutsplus.com/tutorials/sending-data-with-retrofit-2-http-client-for-android--cms-27845 если вы откроете этот сайт, то можете увидеть в конце статьи тестирование приложение то у меня получилось при нажатии на кнопку реализовать подобное, но дальше я попробовал сделать свой запрос на нужный мне адрес, и почему-то теперь вообще на сервер ничего не идет. Если кто знает в чем у меня ошибка то буду благодарен за помощь.

Answer 1

ApiUtils

Что это? Зачем? Почему? Что там внутри происходит?

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://мой-сайт/v1/login/")
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
retrofit.create(APIService.class);

А это вы для чего делаете? Собираете в билдере объект ретрофита, получаете инстанс вашего интерфейса и... ничего с ними не делаете? А откуда вы тогда берёте и инициализируете mAPIService? А зачем делать это каждый раз при нажатии, если инициализировать нужно только один раз перед использованием?

Нужно делать так:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://мой-сайт/v1/login/")
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
APIService mAPIService = retrofit.create(APIService.class);
mAPIService.auth(/* */).enqueue(/* */);
Answer 2

Кнопка работает - не выполняется условие if (response.isSuccessful()), а альтернативный случай Вы никак не обрабатываете. Добавьте обработку неудачного запроса (пример).

Адрес запроса складывается из BASE_URL, заданного при создании клиента, и пути, указанного в аннотации метода интерфейса APIService.
Плейсхолдеры подставляют значения в путь из @Path параметров метода - и того у Вас формируется адрес запроса

BASE_URL + {parameter_0}/{parameter_1}
https://мой сайт/qwerty/abcdef

а должен быть https://мой-сайт/v1/login/

Измените APIService так:

public interface APIService {
    @POST("/v1/login")
    Call<Post> auth(@Body Post body);
}

И, соответственно base url должен быть https://мой сайт/

READ ALSO
Сменить Email Firebase

Сменить Email Firebase

Написал проект, сделал в нем Firebase crashlitics, привязал его к своему основному email, теперь раскаиваюсьСтоит запилить новую функцию, наловить багов,...

176
Программная обработка bottomsheetbehavior

Программная обработка bottomsheetbehavior

есть приложение и оно как бы все работает, только не получается прикрутить bottomsheetbehavior - постоянно вылетает в строчке изменения состоянияПодскажите...

184
Удаление скомпилированных файлов

Удаление скомпилированных файлов

Я пишу приложение на Spring-bootКратко о задачи: пользователи будут заливать файлы исходного кода на сервер, и на сервере они будут компилироваться...

175
Ускорить gradle build, Android Studio

Ускорить gradle build, Android Studio

У меня вопрос, можно ли компилировать только, к примеру, один класс программыПросто проект огромный, и ждать пока скомпилируется на телефон...

190