отображать данные API с царством не работает Android-студии - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь использовать базу данных областей для отображения моих данных API.Я хочу отобразить название компании, однако данные говорят, что они вставлены в журнал, но не могут отображать данные в пользовательском интерфейсе.Вот код .. Любая помощь будет принята с благодарностью за эту проблему.Переменные находятся вверху, и проблема заключается в том, что когда он достигает успеха, я написал код «запись в БД», но он не отображает данные, а сообщает, что данные были вставлены.

 // Variables for the search input field and results TextViews.
    private EditText mCompanyInput;
    private TextView mTitleText;
    private TextView mDescriptionText;
    private TextView mOfficerText;
    private TextView mTitleText1;
    private TextView mDescriptionText1;
    private OkHttpClient okHttpClient;
    private static final String TAG = "MainActivity";

    private Request request;

    private String url = "https://api.companieshouse.gov.uk/search/companies?q=";

    Button save;
    TextView log;
    Realm realm;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mCompanyInput = findViewById(R.id.companyInput);
        log = findViewById(R.id.log);
        mDescriptionText = findViewById(R.id.descriptionText);
        mOfficerText = findViewById(R.id.officerText);
        mTitleText1 = findViewById(R.id.titleText1);
        mTitleText = findViewById(R.id.titleText);
        mDescriptionText1 = findViewById(R.id.descriptionText1);


        save = findViewById(R.id.searchButton);
        realm = Realm.getDefaultInstance();
        save.setOnClickListener(this);

    }

    public void onClick(View view){
        okHttpClient = new OkHttpClient();

        request = new Request.Builder().url(url).header("Authorization", "k6DNRbTp-AnQWn51JBz5VuPiTl8jv4_etdzoMyhf") .method("GET", null).build();
        Log.d(TAG, "onClick:"+url);

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.i(TAG, e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
Log.i(TAG,response.body().string());
                Log.d(TAG, "onResponse:"+response.code());
            }
        });

        writeToDB(mCompanyInput.getText().toString().trim(), (mDescriptionText.getText().toString().trim()));
        showData();
    }
    public void showData(){
        RealmResults<Company> guests = realm.where(Company.class).findAll();

// Use an iterator to invite all guests
        String op="";

        for (Company guest : guests) {
            op+=guest.getName();
            op+=guest.getAppointments();

        }

        log.setText(op);
    }

    public void writeToDB(final String mTitleText1, final String mDescriptionText1){

        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm bgRealm) {
                Company user = new Company(mTitleText1, mDescriptionText1);
                bgRealm.insert(user);
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                writeToDB(mCompanyInput.getText().toString().trim(), (mOfficerText.getText().toString().trim()));
                showData();
                // Transaction was a success.
                Log.v("Database", "Data Inserted");
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                // Transaction failed and was automatically canceled.
                Log.e("Database", error.getMessage());
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        realm.close();
    }

1 Ответ

0 голосов
/ 14 марта 2019

Почему вы вызываете writeToDB() из метода onSuccess()?Это вызовет рекурсию и продолжит записывать одни и те же данные в область.Правильно вызывать showData() из onSuccess(), но нет особого смысла вызывать его напрямую из onClick().

Я думаю, что ваша проблема заключается в том, что вы пытаетесь обновить пользовательский интерфейс из потока:он вызывается из потока асинхронных транзакций, а не из основного потока.Посмотрите этот ответ (и есть другие, которые вы можете легко найти, узнав о проблеме: Обновление UI / runOnUiThread / final переменные: как написать худой код, который выполняет обновление интерфейса при вызове из другого потока .

...