簡體   English   中英

Android:訪問內部AsyncTask類的變量,但在片段的onCreateView中將其獲取為null

[英]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的值是在AsyncTaskdoInBackground方法中獲取的,然后在AsyncTask對其進行了初始化。 因此,在onCreateView函數內部, Toast將顯示非零值,但您尚未獲得該值,因為尚未設置該值。

您需要在此處檢查Fragment生命周期 ,這清楚地表明onCreateViewonActivityCreated之前被調用。 您正在調用new UbidotsConnection().execute(); onActivityCreated內部的方法,該方法根據您共享的代碼段初始化值。 因此,根據您的實現,我認為該行為是正確的。

我不確定它們中的任何一個是否可能。 我必須在onCreateView中訪問ldrVal ,以便在其超過某個值的基礎上對其執行一些操作。

您無法在onCreateView獲取ldrVal的更新值。 doInBackgroud方法內或AsyncTaskonPostExecute函數內執行必要的操作,其中更新后的值可用於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.

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