我有以下代码,可以从云端获取 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值:90
。我需要访问 onCreateView
中的变量 ldrVal
及其最新值。
最佳答案
我认为该值显示正确。我不明白你到底想要什么。但是,存储在 lrdVal
中的值是在 AsyncTask
的 doInBackground
方法中获取的,然后在 AsyncTask
内进行初始化>。因此,Toast 显示非零值,而在 onCreateView 函数内,您没有获取该值,因为该值尚未设置。
您需要检查Fragment lifecycle这里,清楚地表明 onCreateView
在 onActivityCreated
之前被调用。您正在调用 onActivityCreated
内的 new UbidotsConnection().execute();
方法,该方法根据您共享的代码段初始化值。所以我认为根据您的实现,该行为是正确的。
I'm not sure if either of them is possible though. I have to access
ldrVal
inonCreateView
in order to perform some operations on it based if it exceeds a certain value.
您无法在 onCreateView
中获取 ldrVal
的更新值。在 doInBackgroud
方法或 AsyncTask
的 onPostExecute
函数内执行必要的操作,其中更新的值将可用于 ldrVal
。
I fetched ldrVal in onPostExecute but I still got it as 0 when I displayed variable in a Toast in onCreateView. Here is what I did: @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();
}
}
关于java - Android:访问内部 AsyncTask 类的变量,但在 fragment 的 onCreateView 中将其设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50534854/