Java动态定义对象

时间:2013-07-09 21:29:04

标签: java android object android-asynctask

所以我对我最近遇到的事情有一个一般性的问题。让我们说我有2个课程,活动和任务。在Activity中,实例化一个新的Task对象,但不是给出它的通常参数,而是在括号中引入一些新代码,并在该实例化上调用其中一个方法。我已经看到在对象创建后立即调用它们的方法,但也没有重新定义它的行为。这是基于Android的,所以也许它与此有关,但这种语法上的怪异似乎更像是Java概念而不是Android引入的东西。这是类文件:

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

    @Override
    protected String doInBackground(String... args) {

        try {
        //do things here
        } catch (Exception ex) {
        ex.printStackTrace();
        Log.e("Exception", ex.toString());
        }

        return Text;
    }

}

这是要创建的对象,然后实例化它的代码在这里:

new Task() {
                    @Override
                    public void onPostExecute(String result) {
                        Log.d("JSON", result);
                        try {
                            if (jObject.has("error")) {
                                //Do something here
                            }
                            else if (!paymentCheck(appDomain)){
                                //do something else
                            }
                            else {
                                //Do last thing
                            }
                        } catch (JSONException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }.execute(appDomain, email, password);

我理解AsyncTask是一个古怪的类,因为它将doInBackground方法的结果传递给另一个线程中的onPostExecute,也许这就是为什么这样做了,但我真的不明白为什么你不会只需在Tasks自己的类文件中定义onPostExecute,就像我在其他示例中看到的那样。此外,这个东西编译和运行完美,做了它应该做的一切。我真的不明白背后的推理。希望有人在这里可以提供帮助!感谢

2 个答案:

答案 0 :(得分:2)

这是一种名为anonymous class的Java语法糖。

答案 1 :(得分:0)

我不是Android开发人员所以我并不完全熟悉那里的任何特性,但只要你需要确保响应动作发生在一个单独的线程中以避免死锁等,就会使用此模式或{/ 1>当onPostExecute操纵Task中不可见的对象时。这可以作为范围内任何final个对象的closure