从Async Task返回时,片段未附加到Activity

时间:2016-11-08 05:47:09

标签: android android-fragments android-asynctask

我在A_Activity中添加了三个片段。这些是fragment_1,fragment_2,fragment_3

来自fragment_1的

我正在调用异步类async_class

这是我的Fragment_1:

public class Fragment_1 extends Fragment {

ListView listView;
private TrainingGetData mTrainingGetData = null;
Context mContext;

public Fragment_1(){
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_1, container, false);

    mTrainingGetData = new TrainingGetData(getContext());
    mTrainingGetData.execute((String) null);
    return view;
}


public void setTitle(Context context, ArrayList<String> ids, ArrayList<String> titles, final ArrayList<String> urls){

    final Activity activity=(Activity) context;
    final ArrayAdapter adapter=new ArrayAdapter(context, android.R.layout.simple_list_item_1, titles);
    listView=(ListView) ((Activity) context).findViewById(R.id.listView_1);
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent myIntent = new Intent(activity, AnotherActivity.class);
            myIntent.putExtra("url", urls.get(position));
    startActivity(myIntent);
        });
}

}

在async类中我在后台执行一些任务,在post executionde中我添加了这些代码

public class TrainingGetData extends AsyncTask<String, String, String> {
Fragment_1 fragment_1=new Fragment_1();

public TrainingGetData(Context context){
    mContext=context;
}

@Override
protected String doInBackground(String... params) {

    try {
        //do the processing
    }
    catch (JSONException e) {
        e.printStackTrace();
        return "JSON Data Parse Error";
    }
    catch (Exception e){
        e.printStackTrace();
        return "Unknown Error: Insert/Update Failed";
    }
    return null;
}

@Override
protected void onPostExecute(String message) {

    if(success == 0 && message.equals("No files found")){
        Toast.makeText(mContext, "Sorry No Data Found", Toast.LENGTH_SHORT).show();
    }

    if(success==1) {
        //do the processing
        fragment_1.setTitle(mContext, ids, titles, urls);
    }
}
}

但当我返回fragment_1 setTitle方法并单击任何列表项时,它会显示fragment_1未附加到Activity。

出了什么问题? 我该如何解决这个问题?

由于

3 个答案:

答案 0 :(得分:0)

  

但是当我返回fragment_1 setTitle方法并点击任何方法时   列表项显示fragment_1未附加到活动

因为当前正在创建Fragment_1的新对象来调用setTitle方法。

TrainingGetData类中传递当前片段上下文的方式与传递Context相同,然后调用setTitle方法。像:

Fragment_1 fragment_1;

public TrainingGetData(Context context,Fragment_1 fragment_1){
    mContext=context;
    this.fragment_1=fragment_1;
}

并创建TrainingGetData对象:

mTrainingGetData = new TrainingGetData(getContext(),Fragment_1.this);

答案 1 :(得分:0)

您收到错误是因为Fragment Fragment_1的fragment_1对象已在AsyncTask TrainingGetData中实例化。这不是与Fragment相关联的Activity对象。

为了解决这个问题,你需要初始化fragment_1对象,如下所示:

    fragment_1 = (Fragment) mContext;

将以上代码行写在Constructor TrainingGetData的AsyncTask中。

答案 2 :(得分:0)

在创建片段的新实例时。

 Fragment_1 fragment_1=new Fragment_1();

这些不起作用

在TrainingGetData构造函数中使用片段实例并使用它

  public TrainingGetData(Context context, Fragment_1  fragment_1) {
        mContext = context;
        this.fragment_1 = fragment_1;
    }