[英]Android: Accessing a variable of an inner AsyncTask class but getting it as null in onCreateView of a fragment
我有以下代碼從雲中獲取LDR傳感器的價值。 我嘗試訪問的變量是ldrVal
但是當我嘗試在該內部類之外訪問該值時,在Toast
打印該變量時,該變量的值為0。 但是,當我在內部AsyncTask類的Runnable
中打印它時,我得到了正確的非零ldr
值。
public class AutomatedControlsFragment extends Fragment {
public int ldrVal=0;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
new UbidotsConnection().execute();
}
public class UbidotsConnection extends AsyncTask{
private final String API_KEY = "XXXXXXXXXXXXXXXXX";
private final String UBIDOTS_ID_FOR_LIGHT1 = "XXXXXXXXXXXXX";
Value[] ldrValues;
@Override
protected Object doInBackground(Object[] params){
ApiClient apiClient = new ApiClient(API_KEY);
light= apiClient.getVariable(UBIDOTS_ID_FOR_LIGHT1);
ldrValues= light.getValues();
ldrVal= (int) ldrValues[0].getValue();
//Toast.makeText(getActivity().getApplicationContext(), "ldr value: "+ldrVal,Toast.LENGTH_LONG).show();
//toast giving correct value
getActivity().runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getActivity().getApplicationContext(), "ldr value: "+ldrVal, Toast.LENGTH_SHORT).show();
}
});
return null;
}
@Override
protected void onPostExecute(Object o) {
ldrVal= (int) ldrValues[0].getValue();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_automated, container, false);
//toast giving 0
Toast.makeText(getActivity().getApplicationContext(), "ldr value: "+ldrVal,Toast.LENGTH_LONG).show();
return view;
}
}
onCreateView
上的Toast
顯示ldr value: 0
而AsyncTask中的Toast
顯示ldr value: 90
。 我需要使用其最新值訪問onCreateView
的變量ldrVal
。
我認為該值顯示正確。 我不明白你到底想要什么。 但是,存儲在lrdVal
的值是在AsyncTask
的doInBackground
方法中獲取的,然后在AsyncTask
對其進行了初始化。 因此,在onCreateView
函數內部, Toast
將顯示非零值,但您尚未獲得該值,因為尚未設置該值。
您需要在此處檢查Fragment生命周期 ,這清楚地表明onCreateView
在onActivityCreated
之前被調用。 您正在調用new UbidotsConnection().execute();
onActivityCreated
內部的方法,該方法根據您共享的代碼段初始化值。 因此,根據您的實現,我認為該行為是正確的。
我不確定它們中的任何一個是否可能。 我必須在
onCreateView
中訪問ldrVal
,以便在其超過某個值的基礎上對其執行一些操作。
您無法在onCreateView
獲取ldrVal
的更新值。 在doInBackgroud
方法內或AsyncTask
的onPostExecute
函數內執行必要的操作,其中更新后的值可用於ldrVal
。
我在onPostExecute中獲取了ldrVal,但是當在onCreateView中的Toast中顯示變量時,我仍然將其設為0。 這是我所做的:@Override protected void onPostExecute(Object o){ldrVal =(int)ldrValues [0] .getValue(); }
您可以考慮在onPostExecute
函數中傳遞數組,而不是傳遞通用Object o
。
public class UbidotsConnection extends AsyncTask<Void, Void, Value[]> {
private final String API_KEY = "XXXXXXXXXXXXXXXXX";
private final String UBIDOTS_ID_FOR_LIGHT1 = "XXXXXXXXXXXXX";
@Override
protected Value[] doInBackground(Void... params) {
ApiClient apiClient = new ApiClient(API_KEY);
light = apiClient.getVariable(UBIDOTS_ID_FOR_LIGHT1);
Value[] ldrValues = light.getValues();
ldrVal = (int) ldrValues[0].getValue();
//Toast.makeText(getActivity().getApplicationContext(), "ldr value: "+ldrVal,Toast.LENGTH_LONG).show();
//toast giving correct value
getActivity().runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getActivity().getApplicationContext(), "ldr value: " + ldrVal, Toast.LENGTH_SHORT).show();
}
});
return ldrValues;
}
@Override
protected void onPostExecute(Value[] values) {
ldrVal = (int) values[0].getValue();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.