Как добавить текст в TextView через Loader?

233
04 декабря 2019, 17:20

Сейчас изучаю потоки в андроид, и мое задание - сделать счетчик, который добавляет числа от 0 до 9 в TextView через Loader. Понятно, что Loader нужен для других целей, но для задание просто для ознакомления.

У меня есть следующий код:

package asus.example.com.exercise4;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class LoaderActivity extends AppCompatActivity {
    private TextView counter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_threads);
        Button startButton = findViewById(R.id.start_button);
        Button cancelButton = findViewById(R.id.cancel_button);
        startButton.setOnClickListener(listener);
        cancelButton.setOnClickListener(listener);
        counter = findViewById(R.id.counter);
    }
    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.start_button:
                    getSupportLoaderManager().initLoader(0, null, new LoaderClass());
                    break;
                case R.id.cancel_button:
                    break;
            }
        }
    };

    @SuppressLint("StaticFieldLeak")
    class AsyncTaskLoaderClass extends AsyncTaskLoader<Void>{
        AsyncTaskLoaderClass(@NonNull Context context) {
            super(context);
        }
        @Nullable
        @Override
        public Void loadInBackground() {
            for (int i = 0; i<10;i++){
                counter.setText(i);
                SystemClock.sleep(500);
            }
            return null;
        }
    }
    private class LoaderClass implements LoaderManager.LoaderCallbacks<Void>{
        @NonNull
        @Override
        public Loader<Void> onCreateLoader(int i, @Nullable Bundle bundle) {
            return new LoaderActivity.AsyncTaskLoaderClass(LoaderActivity.this);
        }
        @SuppressLint("SetTextI18n")
        @Override
        public void onLoadFinished(@NonNull Loader<Void> loader, Void aVoid) {
            counter.setText("Done!");
        }
        @Override
        public void onLoaderReset(@NonNull Loader<Void> loader) {
        }
    }

}

Во время выполнения программы появляется ошибка: java.lang.IllegalArgumentException: Object returned from onCreateLoader must not be a non-static inner member class: AsyncTaskLoaderClass{eed39bf id=0}

Я понимаю, что AsyncTaskLoaderClass должен быть не внутренним или статическим, но в таком случае я не смогу добавлять текст в TextView. Как решить эту проблему?

READ ALSO
Нужна помощь с заданием [закрыт]

Нужна помощь с заданием [закрыт]

В логе службы есть N записей, в которых указано, что в i-й момент времени Васина программа потребляла Ai мегабайт памятиЕсли в какой-то момент...

135
Если в классе создаю конструктор - не могу наследовать класс, что можно сделать?

Если в классе создаю конструктор - не могу наследовать класс, что можно сделать?

Error: java: constructor Salad in class Salad cannot be applied to given types; required: int found: no arguments reason: actual and formal argument lists differ in length

110
BigDecimal автодобавление 0

BigDecimal автодобавление 0

Хочу получить на выходе (1) без скобок

129
Как сделать выборку только из одной таблицы?

Как сделать выборку только из одной таблицы?

Есть 4 таблицы в базе и все они связаны между собой,нужно вывести данные только из одной таблицыИспользую hibernate, и когда вывожу данные из одной...

116