【问题标题】:Use Async Task in oncreateview在 oncreateview 中使用异步任务
【发布时间】:2019-01-12 13:52:02
【问题描述】:

有没有办法用oncreateview 方法中的异步任务覆盖“week_kg”变量? 异步任务覆盖了变量,但视图已经创建并且不包含新值。

这是与 Node.js 服务器和 Mysql 数据库的 Rest 通信。

public class Feedback extends Fragment {
    private RecyclerView mRecylcerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;


    public String username = "ilovenature";

    public double week_kg;

    String resturl = "http://192.168.178.199:3000/"; //ip


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

        new HttpGet().execute(resturl + "user/" + username);

        ArrayList < Feedback_inhalt > feedback_inhalt = new ArrayList<>();
        feedback_inhalt.add(new Feedback_inhalt(R.mipmap.ic_plastic_color, "Verwertungskosten", "kg eingespart", week_kg));


        mRecylcerView = view.findViewById(R.id.feedback_view);
        mRecylcerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(this.getActivity());
        mAdapter = new FeedbackAdapter(feedback_inhalt);

        mRecylcerView.setLayoutManager(mLayoutManager);
        mRecylcerView.setAdapter(mAdapter);

        return view;
    }


    public class HttpGet extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String...strURLs) {
            URL url;
            String output;
            HttpURLConnection conn;
            try {
                url = new URL(strURLs[0]);
                conn = (HttpURLConnection) url.openConnection();
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuilder sb = new StringBuilder();
                while ((output = br.readLine()) != null) {
                    sb.append(output);
                }
                return sb.toString();
            } catch (IOException e) {
                return "Unable to retrieve web page. URL may be invalid.";
            }
        }
        @Override
        protected void onPostExecute(String result) {
            try {
                JSONArray jsonArray = new JSONArray(result);

                JSONObject jsonObject = jsonArray.getJSONObject(0);
                week_kg = jsonObject.getDouble("wochenkilogramm");

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }

}

【问题讨论】:

    标签: java android httpurlconnection oncreate fragment-oncreateview


    【解决方案1】:

    onCreateView() 方法仅在创建视图时调用一次。

    但是,您可以在您的 AsyncTask 完成执行后刷新您的 RecyclerView。为此,请将新获取的数据添加到您的ArrayList feedback_halt,然后在您的适配器上调用notifyDataSetChanged()

    当您调用notifyDataSetChanged() 时,视图将根据您的 ArrayList 中的数据进行刷新。

    所以,在你设置了week_kg的值之后,在onPostExecute()里面:

    feedback_inhalt.add(new Feedback_inhalt(R.mipmap.ic_plastic_color, "Verwertungskosten", "kg eingespart", week_kg));
    mAdapter.notifyDatSetChanged()
    

    最后,notifyDataSetChanged() 方法只能从 UI 线程调用,但 onPostExecute() 方法在设计上运行在 UI 线程上,所以你可以开始了 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 2017-10-30
      • 1970-01-01
      • 2013-03-29
      • 2019-12-20
      • 2021-05-29
      相关资源
      最近更新 更多