簡體   English   中英

將字符串從 onLoadFinished 方法傳遞到另一個活動

[英]Pass string from onLoadFinished method to another activity

我已經創建了一個內容檢索器,它從另一個應用程序中的內容提供者調用數據,我可以成功讀取數據,但我想將數據從我的內容檢索器中的 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 class 中的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 object 並調用 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() function 時, 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將更新

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM