[英]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.