Передать строку из метода onLoadFinished другому действию - PullRequest
0 голосов
/ 10 июля 2020

Я создал средство извлечения контента, которое вызывает данные от поставщика контента в другом приложении, я могу успешно прочитать данные, но я хочу передать данные из метода onLoadFinished в моем модуле извлечения контента в действие, которое должно отображать данные при нажатии кнопки. Но я не уверен, как это сделать, я пробовал использовать геттер и сеттер, но он ничего не печатает.

Вот строки в моем контент-провайдере:

String[] columns = new String[]{"_id", "item"};
MatrixCursor matrixCursor = new MatrixCursor(columns);


matrixCursor.addRow(new Object[]{1, "FOUND"});

//Test is a string object that gets serialized to Json
matrixCursor.addRow(new Object[]{2, new Gson().toJson(test)});


matrixCursor.setNotificationUri(getContext().getContentResolver(), uri);
return matrixCursor;

I хочу получить данные из второй строки, и это то, что у меня есть в моем onLoadFinished в моем классе Retriever:

class Retriever : LoaderManager.LoaderCallbacks<Cursor>{

private var dataFromJson = ""

//getters and setters
fun setData(data: String){
    this.dataFromJson = data
}

fun getData():String{
    return dataFromJson
}

//other Loader method such as onCreateLoader, etc.

override fun onLoadFinished(loader: Loader<Cursor>, data: Cursor?) {
        try
        {
            val success: Boolean
            if (data != null && data.getCount() > 0)
            {
                data.moveToFirst()
                val dataString = data.getString(1)
                //this works, I am able to find the "found" text at the first row
                success = dataString.equals("FOUND", ignoreCase = true)
                //move to 2nd row
                data.moveToNext()
                //get data from 2nd row does not work
                val JSonData = data.getString(1)
                setData(JSonData)

            }
            else
            {
               Timber.d( "onLoadFinished Unknown error occurred")
                success = false
            }
            //custom interface listener
            listener.onClassListener(success)
        }
        catch (e:Exception) {
            Timber.d("Error")
        }
    }
  }

И в моей деятельности, когда я создаю объект Retriever и вызываю getData () метод, он ничего не отображает.

class TestActivity{
 private lateinit var dataRetriever: Retriever

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test_activity)
        //I have a textView called dataTxt
       //displays nothing
        dataTxt.text = dataRetriever.getData()
    }
}

Любая помощь или совет будут высоко оценены

1 Ответ

0 голосов
/ 10 июля 2020

Это потому, что задача загрузки является асинхронной операцией c, когда вы вызываете функцию getData(), значение dataFromJson, вероятно, все еще остается пустой строкой.

Чтобы легко справиться с это, вы можете объявить интерфейс следующим образом:

interface OnDataRetrieveListener{
    fun onDataLoad(dataString: String)
}

, а затем создать его экземпляр внутри Retriever

private lateinit var listener: OnDataRetrieveListener

fun setListener(listener: OnDataRetrieveListener){
    this.listener = listener
}

установите слушателя в своей деятельности (если анонимно, это похоже на ниже):

 dataRetriever.setListener(object: Retriever.Listener{
        override fun onDataLoad(data: String) {
                    dataTxt.text = dataRetriever.getData()
        }
 })

обратный вызов слушателя, когда строка загружена в Retriever:

...
 val jsonData = data.getString(1)
 listener.onDataLoad(jsonData)
...

, тогда dataTxt обновит

...