Как мне заставить RecyclerView обновить свой макет?

Хорошо, вы пытаетесь получить доступ к графическому интерфейсу через другой поток. Это, в основном, не является хорошей практикой.

AsyncTask выполняет все в doInBackground() внутри другого потока, который не имеет доступа к графическому интерфейсу, где ваши представления.

preExecute() и postExecute() предлагают вам доступ к графическому интерфейсу до и после тяжелого подъема в этом новом потоке, вы можете даже передать результат длинной операции postExecute(), чтобы затем показать какие-либо результаты обработки.

См. эти строки, где вы позже обновив TextView:

TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");

поместите их в PostExecute()

После этого вы увидите текст TextView после завершения doInBackground.

EDIT : Я заметил, что ваш слушатель onClick не проверяет, какой вид был выбран. Я считаю, что самый простой способ сделать это - с помощью операторов switch. [Править]

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings.System;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;

public class AsyncTaskActivity extends Activity implements OnClickListener {

    Button btn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button) findViewById(R.id.button1);
        // because we implement OnClickListener we only have to pass "this"
        // (much easier)
        btn.setOnClickListener(this);
    }

    public void onClick(View view) {
        // detect the view that was "clicked"
        switch (view.getId()) {
        case R.id.button1:
            new LongOperation().execute("");
            break;
        }
    }

    private class LongOperation extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.interrupted();
                }
            }
            return "Executed";
        }

        @Override
        protected void onPostExecute(String result) {
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("Executed"); // txt.setText(result);
            // might want to change "executed" for the returned string passed
            // into onPostExecute() but that is upto you
        }

        @Override
        protected void onPreExecute() {}

        @Override
        protected void onProgressUpdate(Void... values) {}
    }
}
30
задан manfcas 30 July 2016 в 18:41
поделиться