【问题标题】:Retrieving MySQL data dynamically and plotting on android using retrofit and MPAndroidChart使用改造和 MPAndroidChart 动态检索 MySQL 数据并在 android 上绘图
【发布时间】:2021-04-30 21:24:37
【问题描述】:

我正在关注this example。如果我有一个静态 JSON,一切都会正常工作,它会绘制网站中显示的数据。但是,我正在从 MySQL 中检索数据,并且它们每小时都会更新一次(我已经查看了 this;创建一个按钮并可能每小时调用一次 URL),但我不太确定这是否是有效的方法。 我的问题是,如果我有一个每小时都有的 MySQL 表/数据,我如何检索它们并绘制(保留旧值以及绘制新值)?我有以下

带有 URL 的 API 客户端:

public class ApiClient {

    private static Retrofit retrofit = null;

private static OkHttpClient buildClient() {
    return new OkHttpClient
            .Builder()
            .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .build();
}

public static Retrofit getClient() {
    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .client(buildClient())
                .addConverterFactory(GsonConverterFactory.create())

                /**
                 *
                 *  base url here for api
                 */

                .baseUrl("https://xxx")       //retrieve data from MySQL 
                .build();
    }
    return retrofit;
}
}

主活动:

public class BarchartRetrofit extends AppCompatActivity {
    
    
        public ApiInterface apiInterface;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        apiInterface = ApiClient.getClient().create(ApiInterface.class);

        /**
         *  api call to get some data from server
         *
         */
        getData();

    }


    private void getData() {
        Call<PiChart> piChartCall = apiInterface.init();
        piChartCall.enqueue(new Callback<PiChart>() {
            @Override
            public void onResponse(Call<PiChart> call, Response<PiChart> response) {
                Log.d("CHART_RESPONSE", "" + response.body().getBarMonths().toString());
                setData(response.body());
            }

            @Override
            public void onFailure(Call<PiChart> call, Throwable t) {

            }
        });
    }

   

     private void setData(PiChart piChart) {
    
            ArrayList<BarDataSet> dataSets = null;
    
            ArrayList<BarEntry> completed = new ArrayList<>();
    
            for (int i = 0; i < piChart.getBarCompleted().size(); i++) {
                BarEntry value = new BarEntry(piChart.getBarCompleted().get(i), i); // Jan
                completed.add(value);
            }
    
            BarDataSet completeData = new BarDataSet(completed, "Completed Issue");
            completeData.setColor(Color.rgb(0, 155, 0));
    
            ArrayList<BarEntry> pending = new ArrayList<>();
            for (int i = 0; i < piChart.getBarCompleted().size(); i++) {
                BarEntry value = new BarEntry(piChart.getBarPending().get(i), i); // Jan
                pending.add(value);
            }
    
            BarDataSet pendingdata = new BarDataSet(pending, "Pending Issue");
            pendingdata.setColor(Color.rgb(253, 129, 0));
    
            ArrayList<BarEntry> rejected = new ArrayList<>();
            for (int i = 0; i < piChart.getBarCompleted().size(); i++) {
                BarEntry value = new BarEntry(piChart.getBarRejected().get(i), i); // Jan
                rejected.add(value);
            }
    
    
            BarDataSet rejectedData = new BarDataSet(rejected, "Rejected Issue");
            pendingdata.setColor(Color.rgb(255, 0, 0));
    
            dataSets = new ArrayList<>();
            dataSets.add(completeData);
            dataSets.add(pendingdata);
            dataSets.add(rejectedData);
            
            ArrayList<String> xAxis = new ArrayList<>();
            for (String months : piChart.getBarMonths()) {
                Log.d("CHART_RESPONSE", "month: " + months.toString());
                xAxis.add(months);
            }
    
            com.github.mikephil.charting.charts.BarChart chart = (com.github.mikephil.charting.charts.BarChart) findViewById(R.id.barchart);
    
            
            BarData data = new BarData(xAxis, dataSets);
            
            chart.setData(data);
            chart.setDescription("Bar chart");
            chart.invalidate();
    
        }
    }

创建 JSON POJO:

public class Example {

@SerializedName("success")
@Expose
private boolean success;
@SerializedName("bar_months")
@Expose
private List<String> barMonths = null;
@SerializedName("bar_pending")
@Expose
private List<Integer> barPending = null;
@SerializedName("bar_rejected")
@Expose
private List<Integer> barRejected = null;
@SerializedName("bar_completed")
@Expose
private List<Integer> barCompleted = null;

public boolean isSuccess() {
return success;
}

public void setSuccess(boolean success) {
this.success = success;
}

public List<String> getBarMonths() {
return barMonths;
}

public void setBarMonths(List<String> barMonths) {
this.barMonths = barMonths;
}

public List<Integer> getBarPending() {
return barPending;
}

public void setBarPending(List<Integer> barPending) {
this.barPending = barPending;
}

public List<Integer> getBarRejected() {
return barRejected;
}

public void setBarRejected(List<Integer> barRejected) {
this.barRejected = barRejected;
}

public List<Integer> getBarCompleted() {
return barCompleted;
}

public void setBarCompleted(List<Integer> barCompleted) {
this.barCompleted = barCompleted;
}

}

JSON 是:

{
 
  "success": true,
  
  
  "bar_months":[
  "jan",
  "feb",
  "mar"
],
  
  "bar_pending":[
    100,
    200,
    300
  ],
  
   "bar_rejected":[
    140,
    220,
    340
  ],
  
  
   "bar_completed":[
    170,
    290,
    310
  ]
  
}

所以基本上,我在bar_monthsbar_pendingbar_rejectedbar_completed 中的数据将更改而不是静态值,想知道我可以尝试每小时重新训练动态数据的建议/示例。提前感谢您的阅读和帮助!

【问题讨论】:

  • 您面临的具体问题是什么?
  • 感谢拉詹的回复!只是不太确定如何在数据库更新时每小时从 MySQL 检索数据。当数据是静态的时候我可以做...
  • 使用workmanager 来安排定期工作,如果您还想显示旧数据,那么只需存储使用房间检索到的所有数据
  • retrofit 和 room 没有任何关系,room 是 SQLite 数据库之上的抽象层,用于在本地保存数据,任何类型的数据,而 Retrofit 是用于发出 HTTP 请求的库来自您设备的服务器
  • 回到你的问题,if I am using room then do I still use retrofit and do I need to completely write the different code,所以你只需要再添加几行代码,而不是完全不同的代码

标签: java android mysql retrofit mpandroidchart


【解决方案1】:

为了将您的getData() 任务安排为重复执行(即使您的应用不在前台),您可以使用workmanager。 在这种特定情况下,您需要PeriodicWorkRequestBuilder (link)。 第一步是定义您要定期运行的工作,扩展Worker 类以执行此操作:

class ExampleWorker(
    appContext: Context,
    workerParams: WorkerParameters
) :
    Worker(appContext, workerParams) {
    override fun doWork(): Result {
        getData()
        // Indicate whether the work finished successfully with the Result
        return Result.success()
    }

    private fun getData() {
        val piChartCall: Call<PiChart> = apiInterface.init()
        piChartCall.enqueue(object : Callback<PiChart?>() {
            fun onResponse(call: Call<PiChart?>?, response: Response<PiChart?>) {
                Log.d("CHART_RESPONSE", "" + response.body().getBarMonths().toString())
                setData(response.body())
            }

            fun onFailure(call: Call<PiChart?>?, t: Throwable?) {}
        })
    }
}

第二步是以重复的方式安排这项工作,PeriodicWorkRequestBuilder 函数可以帮助你:

private fun schedulePeriodicWork(context: Context) {
    val request =
        PeriodicWorkRequestBuilder<ExampleWorker>(1, TimeUnit.HOURS).build()
    WorkManager.getInstance(context).enqueueUniquePeriodicWork(
        "charSync",
        ExistingPeriodicWorkPolicy.REPLACE, request
    )
}

将调度函数调用放在Application 类的onCreate() 方法中可能是一个明智的选择

【讨论】:

    猜你喜欢
    • 2021-04-26
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2021-07-14
    • 2021-04-19
    • 2021-12-06
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多