Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向片段发出异步任务尚未完成其任务的信号_Java_Android_Android Fragments_Android Asynctask - Fatal编程技术网

Java 如何向片段发出异步任务尚未完成其任务的信号

Java 如何向片段发出异步任务尚未完成其任务的信号,java,android,android-fragments,android-asynctask,Java,Android,Android Fragments,Android Asynctask,在一个片段中,我想防止用户在异步任务未完成时启动另一个任务 所以我有一个全局变量(计数器),我用它向片段发回一个值。异步任务启动,每秒onProgressUpdate调用方法(setVal)将计数器的值发送到片段。我收到碎片中的计数器。它具有正确的值,但每次我尝试在按钮btn1中访问它时,其值始终为0 为什么呢?做我想做的事的正确方法是什么 片段: public class Frag1 extends android.app.Fragment { private static TextV

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

所以我有一个全局变量(计数器),我用它向片段发回一个值。异步任务启动,每秒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);
    }

}
类AsyncCounter扩展AsyncTask{
私人互联网;
私有Frag1 f1=新Frag1();
公共异步计数器(int计数器){
cnt=计数器;
}
@凌驾
受保护的Void doInBackground(Void…参数){

例如(int i=0;i,因此您没有全局变量。您有一个实例变量。实例变量将从您声明这些变量的类中为您创建的每个对象复制,以便每个对象都有自己的状态,与同一类的其他对象的状态分开并独立管理

事实证明,您有许多片段对象。一个是由系统或活动代码创建的,在屏幕上显示其视图。另一个是在任务类中创建的,每次调用
onProgressUpdate
方法时都有一个

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


要执行所需操作,您需要向任务传递对原始片段的引用,例如作为任务构造函数中的参数。然后,使用该引用更新
onProgressUpdate
中的计数器,这样您就没有全局变量。您有一个实例变量。实例变量将为您创建的每个对象复制从声明这些变量的类中删除,这样每个对象都可以有自己的状态,与同一类的其他对象的状态分开并独立管理

事实证明,您有许多片段对象。一个是由系统或活动代码创建的,在屏幕上显示其视图。另一个是在任务类中创建的,每次调用
onProgressUpdate
方法时都有一个

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


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

Frag1 f1=new Frag1()
这在AsyncTask中不起作用为什么这么说?异步任务正在传回正确的值。但是变量的值仍然是0。
Frag1 f1=new Frag1()
这在你的AsyncTask中不起作用为什么这么说?异步任务正在传回正确的值。但是变量的值仍然是0.2分:你在第一段中失去了我;为什么它不是一个全局变量?它在每个方法中都是可见的。另外,我很快编写了这个测试:我不想每次都实例化frag1引用我发布了一个值。但说到最后一段,你能不能更明确一点:如果我向任务传递一个参数,我该如何更新它以使它对frag1可见?@narb我想你对一般编程一定是新手。全局通常意味着从代码的每个点可见,而不仅仅是在单个类中。这确实是一个基本概念。B直截了当:您将片段作为参数传递给任务的构造函数;然后,在构造函数中,您将该值分配给任务的实例变量。在
onProgressUpdate
中,您对该变量调用
setVal
。Giulio,我可以请您快速查看一下我上面更改的代码吗。相同的结果:该值与righ一起出现frag1中的t值,但计数器值等于0。@narb您需要传递给任务的不是计数器值。您需要传递片段。您不需要在任务中创建新的片段实例,否则您仍然有多个具有不同状态的对象。这是…真的,这是编程中的基本内容。您应该在不得不面对Android平台这样的复杂系统之前,可能先看看这些东西。我不认为asynctask中的接口和传递片段实例是基本的东西。两点:你在第一段中失去了我;为什么它不是一个全局变量?它可以从每个方法中看到。我也很快地编写了这个测试:我做到了我不想每次发布一个值时都实例化一个frag1引用。但是说到最后一段,你能更明确一点吗:如果我向任务传递一个参数,我该如何更新它以使它对frag1可见?@narb我想你对一般编程一定是陌生的。全局通常意味着从代码的每个点可见,而不仅仅是insi定义单个类。这确实是一个基本概念。回到正题:您将片段作为参数传递给任务的构造函数;然后,在构造函数中,您将该值分配给任务的实例变量。在
onProgressUpdate
中,您在该v上调用
setVal