基本Java - 一个内部(嵌套?)类可以访问另一个吗?

时间:2012-07-26 02:39:08

标签: java android inner-classes

这就是我认为这里的基本java问题:

这适用于Android项目。我有这个设置:

 public class MyFragmentActivity extends FragmentActivity implements
    ActionBar.TabListener {

     // lots of code edited out


    public static class RateFragment extends Fragment {

             // lots of code edited out

         class InsertTask extends AsyncTask<String, String, Void> {

               protected void onPostExecute(Void v) { {

                // I need to access ReviewTask here
                new ReviewTask().execute();

               } 

         }


    }

    public static class ReviewFragment extendsListFragment {

              class ReviewTask extends AsyncTask<String, String, Void> {

                  // code

              }


    }


}

我真的在问一个基本的Java问题。我知道它不是Android中最好的方法。

如果你必须知道我在做什么:(如果这是令人困惑的,这个信息是低优先级,只是对于某些上下文)我在RateFragment中按下按钮时调用InsertTask并将数据插入MySQL数据库。这就是我想在上面的代码中做的事情:在InsertTask中,最后,在另一个内部类中调用ReviewTask。这将更新列表视图(位于其他选项卡中)。

可以从InsertTask到达ReviewTask吗?

2 个答案:

答案 0 :(得分:4)

我认为你不能这样做。我刚试了一下。以下是你可以做的事情......在片段内部有一个InsertTask的postExecute()方法调用的方法。在此片段方法中,您可以创建新的ReviewTask并触发任务。这样你的内部类就会与你的父类对话,它作为调用之间的委托。

编辑:

public class MyFragment extends FragmentActivity {

        private void delegateMethod(Object result) {
            TaskB b = new TaskB();
            b.doanotherthing(result);
        }

        class TaskA {
            ...
            public void onPostExecute() {
                Object result = new Object();
                delegateMethod(result);
            }
        }

        class TaskB {
            public void doanotherthing(Object o) {
                ...
            }
        }
    }

答案 1 :(得分:1)

如果您将RateFragment的声明更改为非静态,则可以调用

class InsertTask extends AsyncTask<String, String, Void> {

    protected void onPostExecute(Void v) { {

        MyFragmentActivity.this.(new RateFragment()).(new ReviewTask()).execute();

    } 

}

由于您的InsertTask仍在MyFragmentActivity的实例中,因此关键字this仍可使用,您只需使用this告诉它“MyFragmentActivity.this”。请注意,这是类名,而不是实例名。