【问题标题】:Issue with coding the communication between a fragment and an async task编码片段和异步任务之间的通信的问题
【发布时间】:2017-11-11 11:35:32
【问题描述】:

我是这个概念的新手。我阅读了几个主题,但我阻止了,所以提前感谢您的耐心等待!

在一个片段 (frag1) 中,我启动了一个异步任务。我想阻止用户在任务未完成时做任何事情,所以我想传达任务完成的百分比,以便用户等待通知。

我在 java SetVal.java 中定义了一个接口:

interface SetVal {
    void setVal(int val);
}

我的异步任务:

class AsyncCounter extends AsyncTask<Void, Integer, Void> {
    private SetVal sender;

    public AsyncCounter(SetVal sv){
        this.sender = sv;
    }

    @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]);
        sender.setVal(values[0]);
    }

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

    public interface SetVal {
        public void setVal(int val);
    }


    public void setListener(SetVal listener) {
        this.sender = listener;
    }
}

我很想知道如何将界面传递给任务。 我的代码正确吗? 如何实例化异步任务?

片段:

public class Frag1 extends android.app.Fragment implements SetVal {
    private static TextView txt;
    private int counter;
    SetVal listener;

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


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_frag1, container, false);
    }

    @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(???????);
                ac.execute();
            }
        });

    }

    @Override
    public void setVal(int val) {
        counter = val;
    }
}

【问题讨论】:

    标签: android android-fragments interface android-asynctask


    【解决方案1】:

    不确定您尝试这样做的目的和原因,但您可以通过 Fragment :

    尝试创建私有方法:

    public void onClick(View v) {
       startMyAsync();
    }
    
    private void startMyAsync() {
        new AsyncCounter(this).execute();
    }
    

    终于:

    public AsyncCounter(Frag1 context){
        this.sender = (SetVal)context;
    }
    

    【讨论】:

    • MyActivity 未解决,所以我尝试使用 Context 但它崩溃了 java.lang.ClassCastException com.narb.nestedfragments.MainActivity 无法转换为 com.narb.nestedfragments.AsyncCounter$SetVal
    • @narb MyActivity 没有解决,因为我只是给了一个假名。它应该是包含您的片段的活动。检查更新的答案
    • 这就是我所做的(包括 Context 和 Activity),当尝试执行“this.sender = (SetVal) context;”时它崩溃了出现错误 java.lang.ClassCastException: com.narb.nestedfragments.MainActivity 无法转换为 com.narb.nestedfragments.AsyncCounter$SetVal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多