从外部片段调用内部AsyncTask

时间:2014-11-08 22:16:15

标签: java android android-fragments interface android-asynctask

我有一个内部AsyncTask,我从包含此AsyncTask的片段外部的片段调用。我已经阅读并看到了一些使用界面的例子。我无法弄清楚如何在我的项目中实现它。

这是我内心的AsyncTask:

public class LoadQueueTask extends AsyncTask<Void, Void, Queue>
    {

        @Override
        protected Queue doInBackground(Void... arg0) {
            Model model = Model.getInstance();
            return model.getQueue();

        }
        @Override
        protected void onPostExecute(Queue result) {
            super.onPostExecute(result);
            queue = result;
            if(result == null) {
                listview.setEmptyView(empty);
                progress.setVisibility(View.GONE);
                listview.setVisibility(View.VISIBLE);               
                emptyText.setText("Empty Queue");
                emptyImage.setImageResource(R.drawable.ic_action_warning);

            } else {
                if(result.getSlots().size() != 0) {
                    Handler mHandler = new Handler();
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            callAsynchronousTask();
                        }
                    }, 5000);
                } else {
                    listview.setEmptyView(empty);
                    progress.setVisibility(View.GONE);
                    listview.setVisibility(View.VISIBLE);
                    emptyText.setText("No items found");
                }
            }
        }
    }

这是我想要执行此任务的片段:

   public class Fragment extends SherlockFragment{
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment, container, false);
        }

        ViewPager mViewPager = (ViewPager) rootView.findViewById(R.id.viewPager);
        kbps = (TextView) rootView.findViewById(R.id.speed);
        refresh = (ImageView) rootView.findViewById(R.id.refresh);

        refresh.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //CALL ASYNCTASK HERE   
            }
        });

        return rootView;
    }

3 个答案:

答案 0 :(得分:0)

您可以将分离的邮件系统用作EventBusOtto。 第一个片段是发布者和第二个订阅者。在后者中,您将启动AsyncTask。

稍后,只要您需要将对象从一个组件发送到另一个组件,就可以在应用程序的任何位置使用该系统。

答案 1 :(得分:0)

只需将AsyncTask移动到自己的公共类中,您就可以从任何地方调用它。有一个回调接口,并在你调用AsyncTask的片段中实现它。

答案 2 :(得分:0)

为Fragment类创建一个接口

public interface OnFragmentButtonListener{
    onMyButtonClicked();
}

现在,让托管这些片段的活动实现此接口。

在OnClick方法中,进行该调用

((OnFragmentButtonListener)getActivity()).onMyButtonClicked();

接下来在托管AsyncTask内部类的Fragment类中创建一个方法。

public void startAsyncTask(){
    new LoadQueueTask.execute();
}

在活动中,你被迫在onMyButtonClicked()上实现你的接口方法; 在此方法中,获取片段的句柄并调用片段中的startAsyncTask方法。