Android如何将值从异步任务传递到片段

时间:2016-06-01 04:20:59

标签: android android-fragments android-asynctask

在我的Android项目中,我使用 TabLayout ,我有

Fragment1   --> Fragment2(AlertDialog)
           |
 button1---      name:
 listview        Id:
               okButton--->AsyncTask

此处,在按 button1 后,在 Fragment1 中调用另一个片段(Fragment2),在填写表格后按 okbutton 调用 AsyncTask 从服务器接收数据。然后数据需要显示在 Fragment1'中  列表视图

我的课程:

接口

public interface TaskCompleted {
        // Define data you like to return from AysncTask
        public void onTaskComplete(Integer result);
}

片段1

public class Fragment1 extends Fragment implements TaskCompleted {



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

        View view = inflater.inflate(R.layout.fragment_one, container, false);

        btn1 = (Button) view.findViewById(R.id.button1);
        listview = (ListView) view.findViewById(R.id.listview);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment picker = new SearchFragment();
                picker.show(getActivity().getFragmentManager(), "dialog");
                 }
        });

        return view;
    }

public static void submit(final String serverResponse) {
        @SuppressWarnings("unused")
        final class DownloadJSON extends AsyncTask<String, String, Void> {



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

                    //code to process response



                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void args) {

                //display into adapter

            }
        }
    }
}

Fragment2

public class Fragment2 extends DialogFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View content = inflater.inflate(R.layout.dialog_fragment, null);

        builder.setView(content);
        builder.setMessage("form")
                // Positive button
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        new JSONfunctions(getActivity()).execute();
                    }
                });

        // Create the AlertDialog object and return it
        return builder.create();
    }

    @Override
    public void onTaskComplete(String serverResponse) {
        // TODO Auto-generated method stub

    }}

的AsyncTask

public class JSONfunctions extends AsyncTask<String, String, String> {

private TaskCompleted mCallback;
public JSONfunctions(Context context){
this.mContext = context;
 this.mCallback = (TaskCompleted) context;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog = new ProgressDialog(mContext);
mProgressDialog.setIndeterminate(false);
mProgressDialog.show();
}

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

String serverResponse="";
try {
====code to connect to server===

return serverResponse; (return result)
}

}  catch (Exception e) {
e.printStackTrace();
}
return serverResponse;
}
@Override
protected void onPostExecute(String result) {
mProgressDialog.dismiss();
 mCallback.onTaskComplete(result);
}   
}

MainActivity 我也有

@Override
public void onTaskComplete(String serverResponse) {
    Fragment2.submit(serverResponse); 
    }

在按 okbutton 后,使用 fragment2 中的代码,它会调用 asyncTask 并从服务器获得成功的响应..但没有显示到listview ..为什么?????

1 个答案:

答案 0 :(得分:0)

为这么简单的任务实施了这样一个复杂的场景。 您需要做的就是让Fragment1实现TaskCompleted接口并在单独的类中创建AsyncTask,并在此任务中创建TaskCompleted属性。

当在onPostExecute中只调用监听器函数时,你必须在构造函数中创建对象时将片段引用传递给异步任务。

final class DownloadJSON extends AsyncTask<String, String, Void> {

        //your attributes
         TaskCompleted listener;

        public DownloadJSON(TaskCompleted listener){
          this.listener = listener;
        }
        @Override
        protected Void doInBackground(String... params) {
                try {

                jsonarray = new JSONArray(serverResponse);
                Gson gson = new Gson();


                User[] user = gson.fromJson(jsonarray.toString(), User[].class);

                // Contact con = new Contact();
                for (int i = 0; i < user.length; i++) {
                    HashMap<String, String> map = new HashMap<String, String>();

                    map.put("name", user[i].getFullname());
                    map.put("id", user[i].getId());
                    // Set the JSON Objects into the array
                    arraylist.add(map);

                }

            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void args) {

            listener.onTaskCompleted(arraylist);

        }
    }

   public class Fragment1 extends Fragment implements TaskCompleted {

       @Override
       public void onTaskComplete(ArraList<YourListModel> data) {
         adapter = new ListViewAdapter(activity, data);
            // Set the adapter to the ListView
            listview.setAdapter(adapter);
       }
   }

还在必要时应用空检查。