Сейчас я изучаю Threads
, и моя задача - создать счетчик, который с помощью Loader
добавит число от 0 до 9 к TextView
.Конечно, я знаю, что это не лучший вариант использовать 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
.Итак, как я могу решить эту проблему?
UPD
Я изменил код при нажатии кнопки запуска таким образом:
case R.id.start_button:
Loader loader = getSupportLoaderManager().initLoader(0, null, LoaderActivity.this);
loader.forceLoad();
Log.i(TAG, "Button start clicked");
break;
Итеперь каждый раз в цикле у меня появляется следующая ошибка:
E/e.com.exercise: Invalid ID 0x00000009.
E/EventBus: Could not dispatch event: class asus.example.com.exercise4.LoaderActivity$MyAsyncTaskLoader$ProgressEvent to subscribing class class asus.example.com.exercise4.LoaderActivity
android.content.res.Resources$NotFoundException: String resource ID #0x9
UPD 2
Наконец исправлена проблема следующим образом:
Был
counter.setText(i);
Сейчас
counter.setText(""+i);
Возможно, я не понимаю, почему это работает, но работает