0

所以我有一个关于我最近遇到的事情的一般性问题。假设我有 2 个类,Activity 和 Task。在 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自己的类文件,就像我在其他示例中看到的那样。此外,这个东西编译并运行得非常好,做它应该做的一切。我只是不明白背后的原因。希望这里有人可以提供帮助!谢谢

4

2 回答 2

2

这是一种称为匿名类的 Java 语法糖。

于 2013-07-09T21:32:11.557 回答
0

我不是 Android 开发人员,所以我并不完全熟悉那里的任何特性,但是当您需要确保响应操作发生在单独的线程中以避免死锁等onPostExecute操作对象时使用此模式中不可见Task。这可以作为对范围内任何对象的一种封闭。final

于 2013-07-09T21:36:21.043 回答