【问题标题】:Pass string from onLoadFinished method to another activity将字符串从 onLoadFinished 方法传递到另一个活动
【发布时间】:2020-07-10 15:13:42
【问题描述】:

我创建了一个内容检索器,它从另一个应用程序中的内容提供程序调用数据,我可以成功读取数据,但我想将数据从我的内容检索器中的 onLoadFinished 方法传递给应该显示数据的活动按下按钮。但我不确定该怎么做,我尝试使用 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;

我想从第二行获取数据,这就是我在我的 Retriever 类的onLoadFinished 中拥有的数据:

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()
    }
}

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

【问题讨论】:

    标签: java android kotlin android-contentprovider


    【解决方案1】:

    这是因为加载任务是异步操作,当你调用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 将会更新

    【讨论】:

    • 嗨,非常感谢您的回答,但我想在函数中设置监听器,所以当我点击按钮时,我可以调用这个dataRetriever.setListener(object: Retriever.Listener{ override fun onDataLoad(data: String) { dataTxt.text = dataRetriever.getData() } }) 但我收到一个错误说监听器没有初始化?
    • 对不起,我不知道set the listener in a function是什么意思,你能提供一些代码吗?
    • 没问题,我设法解决了这个问题。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2013-03-29
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多