gpt4 book ai didi

java - 如何向 fragment 发出异步任务尚未完成其任务的信号

转载 作者:行者123 更新时间:2023-12-02 02:30:19 25 4
gpt4 key购买 nike

在 fragment 中,我想防止用户在异步任务未完成时启动另一个任务。

所以我有一个全局变量(计数器),我用它来向 fragment 发出一个值的信号。异步任务启动,每秒 onProgressUpdate 调用方法 (setVal) 将计数器的值发送到 fragment 。我在 fragment 中收到计数器。它具有正确的值,但每次我尝试在按钮 btn1 中访问它时,它的值始终为 0。

这是为什么呢?做我想做的事的正确方法是什么?

fragment :

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);
}

}

最佳答案

所以你没有全局变量。你有一个实例变量。实例变量会为您从声明这些变量的类中创建的每个对象进行复制,以便每个对象都可以拥有自己的状态,与同一类的其他对象的状态分开并独立管理。

事实证明你有很多 fragment 对象。由系统或您的 Activity 代码创建的一个,在屏幕上显示其 View 。您在任务类中创建的许多任务,每次调用 onProgressUpdate 方法时都会创建一个。

还记得从单个类创建的对象的“分离且独立管理”状态吗?您可以在这里看到它的工作原理:原始 fragment ,即您在屏幕上看到的 fragment ,始终保持其计数器的原始值,即它开始时的值。该任务更新其创建的 fragment 的计数器值;并且每个计数器仅递增一次,因为任务每次想要更新计数器时都会创建一个新 fragment 。

要执行您想要的操作,您需要向任务传递对原始 fragment 的引用,例如作为任务构造函数中的参数。然后,使用该引用更新 onProgressUpdate 中的计数器。

关于java - 如何向 fragment 发出异步任务尚未完成其任务的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47228661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com