java - Android:访问内部 AsyncTask 类的变量,但在 fragment 的 onCreateView 中将其设置为 null

标签 java android

我有以下代码,可以从云端获取 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 中的值是在 AsyncTaskdoInBackground 方法中获取的,然后在 AsyncTask 内进行初始化>。因此,Toast 显示非零值,而在 onCreateView 函数内,您没有获取该值,因为该值尚未设置。

您需要检查Fragment lifecycle这里,清楚地表明 onCreateViewonActivityCreated 之前被调用。您正在调用 onActivityCreated 内的 new UbidotsConnection().execute(); 方法,该方法根据您共享的代码段初始化值。所以我认为根据您的实现,该行为是正确的。

I'm not sure if either of them is possible though. I have to access ldrVal in onCreateView in order to perform some operations on it based if it exceeds a certain value.

您无法在 onCreateView 中获取 ldrVal 的更新值。在 doInBackgroud 方法或 AsyncTaskonPostExecute 函数内执行必要的操作,其中更新的值将可用于 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/

相关文章:

java - 如何防止后退按钮直到确认消息?

Android:无法在 SharedPreferences 中保存 boolean 值

java - Libgdx动态改变表内的图像

Java 唤醒 hibernate 线程

android - 如何在android中获取用户日期时间设置

java - 在 Java9 中,终结器已被弃用,取而代之的是引入了清理器。两者有什么区别?

java - Tomcat 日志 : What's the difference between %D and %F?

c# - 如何在Xamarin中使用MediaPlayer获得跟踪的持续时间

java - 重复代码行的替代方案(Android/Java)

java - Hibernate 使用条件连接