【问题标题】:Call AsyncTask in the parent activity from fragment在片段的父活动中调用 AsyncTask
【发布时间】:2014-11-06 12:16:28
【问题描述】:

我有一个带有片段寻呼机的活动,我想知道如何从片段调用位于该活动上的异步任务。
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> {
         ...
    }

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

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

}

【问题讨论】:

  • 你从哪里调用otherfragment??
  • new addVR().execute(params);
  • @Chelbta 只需在此片段中传递您的主要活动的引用,然后调用它
  • @NaveenTamrakar 这不起作用,因为我没有从 Addactivity 调用 asyntask。还有为什么要投反对票?
  • @AvinashKumarPankaj 如何做到这一点?对不起,我是初学者。

标签: java android android-fragments android-asynctask


【解决方案1】:

在你的片段中:

((AddActivity) getActivity()).someMethodToCallAsyncTaskInAddActivity();

inf 你的 AddActivity:

public void someMethodToCallAsyncTaskInAddActivity() {

       new AsyncTask(someOptions_if_needed).execute();

}

更多选择

public static  class ASyncronius extends AsyncTask<Void, Void, Void> 

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

AddActivity.ASyncronius  abs = new AddActivity.ASyncronius ();
abs.execute()

编辑 2014-11-11

如果您在不同的活动中使用片段,那么您应该确保这些活动扩展同一个包含异步方法的主类。

class ParentActivity extends Activity {

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

  public class async extends AsyncTask<void, void, void>{
  ***Some stuff***
 }
}

然后:

class FirstActivity extends ParentActivity{

}

还有

class SecondActivity extends ParentActivity{

}

在你的片段中

((ParentActivity)getActivity()).someMethodToCallAsyncTaskInParentActivity();

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

try{
 ((FirstActivity)getActivity()).someMethodToCallAsyncTaskInParentActivity();
} catch( Exception e) {
   // this is not needed activity
}

【讨论】:

  • 是的,谢谢,但还有其他方法吗?
  • @Alpha 你知道如何从 AddActivity 获取不同字段的值当用户单击按钮时,我尝试执行类似 public void callAsynkTask() { EditText editText = (EditText) findViewById(R.id.visitDateFiled); Toast.makeText(getApplicationContext(), editText.getText().toString(), Toast.LENGTH_LONG);} } 的操作,但 EditText 始终为空
  • @Alpha 对于第二个解决方案它不起作用,因为我有一些 dialogProgress 所以我不能使用静态
  • @Alpha 如果有任何方法可以用动态表达式替换这个((AddActivity) getActivity()) 就像((ParentActivity) getActivity()) 因为相同的片段被不同的活动AddActivity 和EditActivity 使用
  • 制作只有你的Asynctask的ParentActivity然后那些你用于片段的不同活动,扩展不是Activity而是ParentActivity,然后你可以使用你的代码行。 "((ParentActivity) getActivity())"
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多