从片段中调用父活动中的AsyncTask

Chl*_*bta 2 java android android-asynctask android-fragments

我有片段寻呼机的活动,我想知道如何从片段调用位于该活动上的asynctask.
AddActivity.java

public class AddActivity extends FragmentActivity {

    ViewPager vp;
    ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);

        vp = (ViewPager) findViewById(R.id.pager);
        PagerAdapter pa = new FragPagerAdapter(getSupportFragmentManager());
        vp.setAdapter(pa);

    }


    //This void to get All field from the differents fragments and put them into jsonObject
    protected JSONObject createJsonObjectVR () {
        ...
    }

    // Call the Post Method
    public class addVR extends AsyncTask<String, String, String> {
         ...
    }
Run Code Online (Sandbox Code Playgroud)

OtherFragment.java

public class OtherFragment extends Fragment {
    Button btn;

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


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_other, container, false);
        btn = (Button) view.findViewById(R.id.send);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Here I want to call the createVR asynctask in the parent Activity
            }
        });
        return view;
    }
}
Run Code Online (Sandbox Code Playgroud)

FragPagerAdapter

public class FragPagerAdapter extends FragmentPagerAdapter {

    public FragPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {

        switch (index) {
            case 0:
                // First Fragment The main
                return new FirstFragment();
            case 1:
                // Milk (Second) fragment activity
                return new SecondFragment();
            case 2:
                // Housing (Third) fragment activity
                return new HousingFragment();
            case 3:
                //Feeding (fourth) fragment activity
                return new FeedingFragment();
            case 4:
                // Other (Fith the last) fragment activity
                return new OtherFragment();
        }

        return null;
    }

    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 5;
    }

}
Run Code Online (Sandbox Code Playgroud)

Alp*_*pha 11

在你的片段中:

((AddActivity) getActivity()).someMethodToCallAsyncTaskInAddActivity();
Run Code Online (Sandbox Code Playgroud)

你的AddActivity:

public void someMethodToCallAsyncTaskInAddActivity() {

       new AsyncTask(someOptions_if_needed).execute();

}
Run Code Online (Sandbox Code Playgroud)

还有一个选择

public static  class ASyncronius extends AsyncTask<Void, Void, Void> 
Run Code Online (Sandbox Code Playgroud)

如果你使它静态,你可以从任何地方调用这个异步任务

AddActivity.ASyncronius  abs = new AddActivity.ASyncronius ();
abs.execute()
Run Code Online (Sandbox Code Playgroud)

编辑2014-11-11

如果你在不同的活动中使用片段,那么你应该shure做shure,那些活动扩展相同的主类,包含异步方法.

class ParentActivity extends Activity {

someMethodToCallAsyncTaskInParentActivity(){
***new async execute***
} 

  public class async extends AsyncTask<void, void, void>{
  ***Some stuff***
 }
}
Run Code Online (Sandbox Code Playgroud)

然后:

class FirstActivity extends ParentActivity{

}
Run Code Online (Sandbox Code Playgroud)

class SecondActivity extends ParentActivity{

}
Run Code Online (Sandbox Code Playgroud)

在你的片段中

((ParentActivity)getActivity()).someMethodToCallAsyncTaskInParentActivity();
Run Code Online (Sandbox Code Playgroud)

或者如果您不需要在其他活动中使用异步任务,那么只需执行以下操作:

try{
 ((FirstActivity)getActivity()).someMethodToCallAsyncTaskInParentActivity();
} catch( Exception e) {
   // this is not needed activity
}
Run Code Online (Sandbox Code Playgroud)