簡體   English   中英

如何向片段發出異步任務尚未完成的信號

[英]How to signal to a fragment that an async task has not finished its task

在一個片段中,我想防止用戶在異步任務未完成時啟動另一個任務。

因此,我有一個全局變量(計數器),用於將值發信號給片段。 異步任務開始,並且每秒onProgressUpdate調用方法(setVal)將計數器的值發送到片段。 我收到片段中的計數器。 它具有正確的值,但是每次我嘗試在按鈕btn1中訪問它時,其值始終為0。

這是為什么? 做我想要的正確方法是什么?

分段:

public class Frag1 extends android.app.Fragment {
    private static TextView txt;
    private static View view;
    private int counter;

    public Frag1() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = null;
        view = inflater.inflate(R.layout.fragment_frag1, container, false);
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        txt = (TextView) getActivity().findViewById(R.id.txt);
        Button btn = (Button) getActivity().findViewById(R.id.btn1);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Log.i("Frag1","val: "+counter);
                if(counter > 0) return;
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                Frag2 f2 = new Frag2();
                ft.replace(R.id.content_frame, f2);
                ft.addToBackStack("f2");
                ft.commit();
            }
        });

        Button btn2 = (Button) getActivity().findViewById(R.id.btn2);
        btn2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                AsyncCounter ac = new AsyncCounter(counter);
                ac.execute();
            }
        });

    }

    void setVal(int i){
        counter = i;
    }

}

異步任務:

class AsyncCounter extends AsyncTask<Void, Integer, Void> {
    private int cnt;
    private  Frag1 f1 = new Frag1();

    public AsyncCounter(int counter) {
        cnt = counter;
    }

    @Override
    protected  Void doInBackground(Void... params) {
        for(int i=0;i<60;i++){
            publishProgress(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        Log.i("ASYNC TASK","val: "+values[0]);
        cnt = values[0];
        f1.setVal(cnt);
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
    }

}

因此,您沒有全局變量。 您有一個實例變量。 實例變量是為您從聲明了這些變量的類創建的每個對象復制的,因此每個對象可以具有自己的狀態,並與同一類的其他對象的狀態分開並進行獨立管理。

事實證明您有許多片段對象。 由系統或您的活動代碼創建的一種,在屏幕上顯示其視圖。 以及您在任務類中創建的許多類,每次調用onProgressUpdate方法一次。

還記得有關從單個類創建的對象的“分離且獨立管理”狀態的內容嗎? 您可以在這里看到它的工作:原始片段,即您在屏幕上看到的片段,始終保持其計數器的原始值,即其起始值。 任務更新其創建的片段的計數器值; 並且每個計數器僅增加一次,因為該任務每次要更新計數器時都會創建一個新的片段。

要執行您想要的操作,您需要將對原始片段的引用傳遞給任務,例如,作為任務構造函數中的參數。 然后,使用該引用來更新onProgressUpdate的計數器。

暫無
暫無

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

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