【问题标题】:How do I refresh my app every second with data from JSON?如何使用来自 JSON 的数据每秒刷新我的应用程序?
【发布时间】:2016-04-13 02:00:54
【问题描述】:

我已经构建了一个从 JSON URL 获取信息并将其放入 textview 和 BarChart(mikephil 的 API)的应用程序,但我希望它每秒刷新一次。 这是我的 MainActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.grafiek);
    if(savedInstanceState!=null){
        Log.d("STATE", savedInstanceState.toString());
    }

    requestQueue = Volley.newRequestQueue(this);
    chart = (BarChart) findViewById(R.id.chart);
    JsonObjectRequest jor = new JsonObjectRequest(Request.Method.GET, loginURL, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    try{

                        JSONArray ja = response.getJSONArray("result");
                        for(int i=0; i < ja.length(); i++){

                            JSONObject jsonObject = ja.getJSONObject(i);

                            String agv = jsonObject.getString("agv");
                            String binnenschip = jsonObject.getString("binnenschip");
                            String vrachtwagen = jsonObject.getString("vrachtwagen");
                            String zeeschip = jsonObject.getString("zeeschip");
                            String opslag = jsonObject.getString("opslag");
                            String trein = jsonObject.getString("trein");
                            String diversen = jsonObject.getString("diversen");

                            agvz = Integer.parseInt(agv);
                            binns = Integer.parseInt(binnenschip);
                            vracht = Integer.parseInt(vrachtwagen);
                            zschip = Integer.parseInt(zeeschip);
                            opsl = Integer.parseInt(opslag);
                            trei = Integer.parseInt(trein);
                            divers = Integer.parseInt(diversen);

                            ArrayList<BarEntry> entries = new ArrayList<>();
                            entries.add(new BarEntry(agvz, 0));
                            entries.add(new BarEntry(binns, 1));
                            entries.add(new BarEntry(vracht, 2));
                            entries.add(new BarEntry(zschip, 3));
                            entries.add(new BarEntry(opsl, 4));
                            entries.add(new BarEntry(trei, 5));
                            entries.add(new BarEntry(divers, 6));
                            BarDataSet dataset = new BarDataSet(entries, "Aantal containers");

                            ArrayList<String> labels = new ArrayList<String>();
                            labels.add("AGV");
                            labels.add("Binnenschip");
                            labels.add("Vrachtwagen");
                            labels.add("Zeeschip");
                            labels.add("Opslag");
                            labels.add("Trein");
                            labels.add("Diversen");


                            chart = new BarChart(mContext);

                            setContentView(chart);

                            BarData data = new BarData(labels, dataset);
                            chart.setData(data);

                            chart.setDescription("");

                            dataset.setColors(ColorTemplate.COLORFUL_COLORS);

                            /*if(counter == 0) {
                                chart.animateY(2500);
                                counter++;
                            }*/


                        }

                    }
                    catch(JSONException e){
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("Volley","Error");

                }
            }
    );
    requestQueue.add(jor);

这是伴随它的我的 xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/grafiek"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="vertical" >
<com.github.mikephil.charting.charts.BarChart
    android:id="@+id/chart"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"/>
<Button
    android:id="@+id/parseJsongraph"
    android:text="get DATA"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0" />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/json"/>
</RelativeLayout>

最后:这是我开始活动的地方:

public class MainMenu extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.menu);
    final Button grafiek = (Button) findViewById(R.id.grafiek);
    final Button info = (Button) findViewById(R.id.info);

    grafiek.setOnClickListener(new View.OnClickListener() {


        public void onClick(View v) {
            grafiek.setBackgroundColor(Color.GRAY);
            new CountDownTimer(1000, 50) {

                @Override
                public void onTick(long arg0) {
                }

                @Override
                public void onFinish() {
                    grafiek.setBackgroundColor(Color.BLACK);
                }
            }.start();
            goToGrafiek();

        }

    });
    info.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            info.setBackgroundColor(Color.GRAY);
            new CountDownTimer(1000, 50) {

                @Override
                public void onTick(long arg0) {
                }

                @Override
                public void onFinish() {
                    info.setBackgroundColor(Color.BLACK);
                }
            }.start();
            goToInfo();

        }

    });
}
private void goToGrafiek() {

    Intent intent = new Intent(MainMenu.this, grafiek.class);
    startActivity(intent);
}
private void goToInfo(){
    Intent intents = new Intent(MainMenu.this, MainActivity.class);
    startActivity(intents);
}

}

【问题讨论】:

  • 使用gcm更新数据
  • 我认为你可以使用处理程序
  • 从 php(Web 服务器端)设置 cronjob 并每秒运行您的代码,它将更新您在应用程序(移动端)中的数据
  • 为什么需要每秒刷新一次?就表演而言,这听起来不太好恕我直言。添加“拉动刷新”怎么样?
  • 设置定时器并每隔一定时间调用服务。

标签: php android json handler android-volley


【解决方案1】:

处理程序自动更新处理程序;

在你的 OnCreateView 中添加这个

autoUpdateHandler= new Handler

这将每 1 秒调用一次 udpateChartFromJson()。

autoUpdateHandler.postDelayed(new Runnable() {
            @Override
            public void run()
            {
                //start the following method every 1 second. 
                  updateChartFromJson(); 
                  autoUpdateHandler.postDelayed(this,1000);

            }
        },1000);

当 Volley 将其网络调用作为异步任务处理时,这些数据将在后台更新。

这就像一个普通的方法声明:

 public void  updateChartFromJson()
    {
    JsonObjectRequest jor = new JsonObjectRequest(Request.Method.GET, loginURL, null,
                new Response.Listener<JSONObject>() {
                    @Override 
                    public void onResponse(JSONObject response) {

                        try{ 

                            JSONArray ja = response.getJSONArray("result");
                            for(int i=0; i < ja.length(); i++){

                                JSONObject jsonObject = ja.getJSONObject(i);

                                String agv = jsonObject.getString("agv");
                                String binnenschip = jsonObject.getString("binnenschip");
                                String vrachtwagen = jsonObject.getString("vrachtwagen");
                                String zeeschip = jsonObject.getString("zeeschip");
                                String opslag = jsonObject.getString("opslag");
                                String trein = jsonObject.getString("trein");
                                String diversen = jsonObject.getString("diversen");

                                agvz = Integer.parseInt(agv);
                                binns = Integer.parseInt(binnenschip);
                                vracht = Integer.parseInt(vrachtwagen);
                                zschip = Integer.parseInt(zeeschip);
                                opsl = Integer.parseInt(opslag);
                                trei = Integer.parseInt(trein);
                                divers = Integer.parseInt(diversen);

                                ArrayList<BarEntry> entries = new ArrayList<>();
                                entries.add(new BarEntry(agvz, 0));
                                entries.add(new BarEntry(binns, 1));
                                entries.add(new BarEntry(vracht, 2));
                                entries.add(new BarEntry(zschip, 3));
                                entries.add(new BarEntry(opsl, 4));
                                entries.add(new BarEntry(trei, 5));
                                entries.add(new BarEntry(divers, 6));
                                BarDataSet dataset = new BarDataSet(entries, "Aantal containers");

                                ArrayList<String> labels = new ArrayList<String>();
                                labels.add("AGV");
                                labels.add("Binnenschip");
                                labels.add("Vrachtwagen");
                                labels.add("Zeeschip");
                                labels.add("Opslag");
                                labels.add("Trein");
                                labels.add("Diversen");


                                chart = new BarChart(mContext); 

                                setContentView(chart);

                                BarData data = new BarData(labels, dataset);
                                chart.setData(data);

                                chart.setDescription(""); 

                                dataset.setColors(ColorTemplate.COLORFUL_COLORS);

                                /*if(counter == 0) { 
                                    chart.animateY(2500); 
                                    counter++; 
                                }*/ 


                            } 

                        } 
                        catch(JSONException e){
                            e.printStackTrace();
                        } 
                    } 
                }, 
                new Response.ErrorListener() {
                    @Override 
                    public void onErrorResponse(VolleyError error) {
                        Log.e("Volley","Error");

                    } 
                } 
        ); 
        requestQueue.add(jor);

    }

【讨论】:

  • 所以我应该把 Handler autoUpdateHandler;在我的公开课 MainActivity 下?如果是这样,我应该把 postDelayed 函数放在哪里?
  • 在你的 mainactivity onCreateView 中包含 postDelayed 函数
【解决方案2】:
swipeRefreshLayout.setOnRefreshListener(() -> {
        homeCategoriesModalList.clear(); // Clean The List Before Adding Updated Data
        categoryCityAreaRecyclerViewAdapter.notifyDataSetChanged();
        jsonResponse();
        categoryCityAreaRecyclerViewAdapter.notifyDataSetChanged();

        swipeRefreshLayout.setRefreshing(false);
    });

处理我的项目

【讨论】:

  • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2019-06-02
  • 2016-09-21
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多