将字符串从 onLoadFinished 方法传递给另一个 activity

Pass string from onLoadFinished method to another activity

我创建了一个内容检索器,它从另一个应用程序中的内容提供者调用数据,我可以成功读取数据,但我想将数据从我的内容检索器中的 onLoadFinished 方法传递到 activity 应该显示按下按钮时的数据。但我不确定该怎么做,我尝试使用 getter 和 setter,但它没有打印任何内容。

这是我的内容提供商中的行:

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;

我想从第二行获取数据,这就是我的 onLoadFinished 在我的 Retriever class:

中的数据
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")
        }
    }
  }

而在我的 activity 中,当我创建 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()
    }
}

任何帮助或建议将不胜感激

这是因为加载任务是一个异步操作,当你调用getData()函数时,dataFromJson的值可能仍然是一个空字符串。

为了轻松处理这个问题,您可以像这样声明一个接口:

interface OnDataRetrieveListener{
    fun onDataLoad(dataString: String)
}

然后在 Retriever

中创建它的一个实例
private lateinit var listener: OnDataRetrieveListener

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

在您的 activity 中设置侦听器(如果是匿名的,如下所示):

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

在 Retriever 中加载字符串时回调监听器:

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

然后 dataTxt 将更新