【问题标题】:Android how to pass value from async task to fragmentAndroid如何将值从异步任务传递到片段
【发布时间】:2016-06-01 04:20:58
【问题描述】:

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

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

这里,在 Fragment1 中按下 button1 后调用另一个 fragment(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

            }
        }
    }
}

片段2

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

    }}

异步任务

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

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

【问题讨论】:

  • ListView 是在 Fragment 中还是在 Activity 中?
  • Fragment1 中的列表视图
  • Preeti,您从哪里添加Fragment2 Fragment?并在MainActivity onTaskComplete 方法中添加日志检查onTaskComplete方法是否被调用
  • 我正在使用 viewpager tablayout。其中 Fragment1 是一个选项卡..来自 Fragment1 我将 Fragment2 作为警报对话框调用。从警报对话框我调用 asynctask..现在我想将异步任务值显示到 Fragment1 的列表视图
  • ok 并且 onTaskComplete 方法在 MainActivity 中是否被调用?

标签: android android-fragments android-asynctask


【解决方案1】:

为如此简单的任务实现了如此复杂的场景。 你只需要让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);
       }
   }

必要时也应用空检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多