Android - 等待对象执行完成后再继续

时间:2017-05-28 08:46:22

标签: android multithreading wait execution mpandroidchart

我正在使用MPAndroidChart在android中绘制一些图表。我面临的问题是以下代码以异步方式执行。 E.g:

Log.d("Starting data load","Starting data load");
x1.setValueFormatter(new GraphXAxisValueFormatter(xLabels_nl,chart));
chart.setData(data);
chart.fitScreen();
Log.d("Finished data load","Finished data load");
  1. "开始加载数据"登录到控制台
  2. setValueFormatter已启动
  3. "完成数据加载"登录到控制台
  4. setValueFormatter仍在运行
  5. 问题是,当setValueFormatter仍在运行时,如果第二次执行了所描述的代码,则图表不会zoom/drag正确地指向它的初始位置。 有没有办法等到第二次启动时"x1.setValueFormatter(new GraphXAxisValueFormatter(xLabels_nl,chart));"的第一次执行完成?

    GraphXAxisValueFormatter是覆盖以下方法的类:

    @Override
        public String getFormattedValue(float value, AxisBase axis) {
    ...
    return <axis values for each point at position "value">
    }
    

    由于

2 个答案:

答案 0 :(得分:0)

真正的解决方案可能在其他地方,您应该在开源库https://github.com/PhilJay/MPAndroidChart/issues

上提出问题

黑客警报 但如果你愿意,你可以让任意代码等你:

ggplot(dd2, aes(x = variable, y = value, group=country, color=country)) + geom_line() + 
  geom_point()

注意 - 你不能让MainThread等待太长时间,否则你会得到一个ANR(你不应该让它真的等待)

答案 1 :(得分:0)

LineChart这样的MPAndroidChart类是View的子类,因此应该在UI /主线程上更新。

如果您正在另一个线程(例如,AsyncTask或使用RxJava)执行数据处理,那很好。但是,{/ 1}}对象本身的修改(例如,为图表变异ViewDataSet)应该在UI /主线程上完成,否则您将遇到同步问题,如一个似乎在上面发生的。这是大多数标准Android视图的标准模式,而不仅仅是MPAndroidChart。请注意,IValueFormatter等中的任何方法都没有实际生成另一个线程,因此消费者有责任确保他们使用正确的线程。

此外,在您更新LineChart后,您需要致电DataSet以让图书馆重新计算最低/最高。