将字符串从 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
将更新
我创建了一个内容检索器,它从另一个应用程序中的内容提供者调用数据,我可以成功读取数据,但我想将数据从我的内容检索器中的 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
将更新