将内部类导入主要的问题 activity 在 Java 上 ( Android )

标签: Java Android
发布时间: 2017/3/19 14:04:47
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我正在做 Android 的应用程序,让使用的 AsyncTask 下载一些数据。为了使我的代码有点更具可读性我重新创建此代码在一个单独的类 ("ContentManager")。然而,我不知道如何将它导入我主 activity

在这里我主要是代码 activity ,其中不工作 (错误:"无法解析符号 DownloadJson"):

public class MyApp extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_category_list);

        ContentManager contentManager = new ContentManager();
        ContentManager downloadJsonTask = new contentManager.DownloadJson();

        downloadJson.execute("http://.../api/...");

    }
}

这里是我 AsyncTask 住在类文件中的代码,(比主要相同的包文件夹的 ContentManager.java activity ):

public class ContentManager {

    // DownloadJson is a class that gets a JSON response given a url specified on the call
    public class DownloadJson extends AsyncTask<String,Void,String> {

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

            // Defined required variables
            String result = "";
            URL url;
            HttpURLConnection urlConnection = null;

            // Try to download content
            try {

                url = new URL(urls[0]);
                urlConnection = (HttpURLConnection)url.openConnection();

                InputStream in = urlConnection.getInputStream();
                InputStreamReader reader = new InputStreamReader(in);

                int data = reader.read();

                while (data != -1) {

                    char currentCharacter = (char)data;

                    result += currentCharacter;

                    data = reader.read();
                }
                return result;
            }
            catch(MalformedURLException e){
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
            return null;
        }
    }
}

如何从另一个文件进口内部的类呢?这是正确的方法做这件事吗?

解决方法 1:

啊,我是老:)

问题在于你 DownloadJson 类的声明。 只是因为它是非静态内部类。

因此它需要您提供外部类参考来创建实例。

所以迫使我们简单地创建实例的方法是︰

DownloadManager dm = new DownloadManager();
dm.new DownloadJson ();
// But this is simply ridiculous right?

正确的方法是要添加到您的 DownloadJson 类静态

public static class DownloadJson extends AsyncTask<String,Void,String> {

与使用简单得多︰

DownloadJson json = new ContentManager.DownloadJson();

所以最后的一件事是说为什么,:) 实际上会发生什么

有两种方法声明的内部类

1-非静态

public class A { 
    int value;
    public class B {
    }
}

B 类对上层阶级的引用并因此它需要创建从类 A,或要创建与类的引用 (作为 context ),声明我们内部类此方式使得能够访问任何非静态的方法、 变量或 type 的上层阶级仿佛你通常会在上层阶级。所以写这段代码是正确在 B 类的内部

void setUpperValue() {
    value = 30; 
}

2-静态

public class A {
    int value;
    public static class B {
    }
}

B 班举行没有提及上层阶级和我们这种不需要任何额外的 context 来创建但是它不能访问到本地 (非静态变量)。 所以调用内部类 b:

value = 20;

将编译 time 错误

赞助商