Я создал приложение, которое получает информацию из URL-адреса JSON и помещает ее в текстовое представление и BarChart (API mikephil), но я хочу, чтобы оно обновлялось каждую секунду.
Вот мой 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);
}
}
Обработчик autoUpdateHandler;
Добавьте это в свой OnCreateView
autoUpdateHandler= new Handler
Это будет вызывать ваш udpateChartFromJson () каждую 1 секунду.
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);
}
Других решений пока нет …