从内部类访问变量

时间:2014-10-29 11:35:04

标签: android inner-classes flow control-flow

我正在尝试访问一个驻留在我的内部类中的变量我发布为单独的问题因为我无法理解当前的情况

public class MyActivity extends Activity {
  static double returnAppSize;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_app_breaker_layout);

    try {
        double appSize = getAppSize("com.supercell.clashofclans");
        System.out.println("appSize: " + appSize);

        double appSize3 = getAppSize("com.dotgears.flappybird");
        System.out.println("appSize: " + appSize3);

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

以下是我想要访问名为" codeSize"

的变量的方法
  public double getAppSize(String packageName) throws NoSuchMethodException,
        IllegalAccessException, IllegalArgumentException,
        InvocationTargetException {
      returnAppSize = 0.0;

    final String pkName = packageName; // "com.dotgears.flappybird";com.supercell.clashofclans

    PackageManager pm = getPackageManager();

    Method getPackageSizeInfo = pm.getClass()
            .getMethod("getPackageSizeInfo", String.class,
                    IPackageStatsObserver.class);

    getPackageSizeInfo.invoke(pm, pkName, new IPackageStatsObserver.Stub() {
        private double appSize;

        @Override
        public void onGetStatsCompleted(PackageStats pStats,
                boolean succeeded) throws RemoteException {
            appSize = ((pStats.codeSize) / 1024) / 1024;
            returnAppSize = appSize;
            Log.i(pkName, "codeSize: " + returnAppSize);
        }
    });
      Log.i(pkName, "codeSize333: " + returnAppSize);
      return returnAppSize;
    }
}

我面临的问题是:

  1. 在计算大小之前打印onCreate方法中的打印件,如何防止此问题导致之后计算大小的原因以及为何先将控件转移回调用。 (我认为这是主要问题)

  2. 如何获得" appSize"的价值在全球变种?我的做法是对的吗?

1 个答案:

答案 0 :(得分:0)

  1. 在计算之前导致打印的原因是什么?计算需要时间,因此可能在不同的线程上计算,当它结束时,它会通知IPackageStatsObserver.Stub您创建并调用onGetStatsCompleted。虽然这发生在另一个线程中,但是你的主线程继续并返回returnAppSize;初始值为0.0。这不是问题,这是正常行为。

  2. 您可以采取的措施您可以添加到您的活动方法中:

    public void calcDone(int size){
        //printing is here
    }
    

    并从内部onGetStatsCompleted调用它。但请记住,如果你想在ui中显示一些东西,请使用runOnUiThread。