2016-11-20 57 views
0

我正在製作一個使用AsyncTask下載某些數據的Android應用程序。爲了讓我的代碼更具可讀性,我在一個單獨的類(「ContentManager」)上重新創建了這段代碼。但是,我不知道如何將其導入到我的主要活動中。將內部類導入Java主要活動的問題(Android)

這裏是我的主要活動,不工作的代碼(錯誤:「無法解析符號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比主活動同一個包文件夾):

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創建,或者使用類A引用(作爲上下文)創建,以這種方式聲明我們的內部類可以訪問任何非靜態方法,變量或上層類的類型,就像你通常會在上層階級。所以寫這個代碼爲B類中正確

void setUpperValue() { 
    value = 30; 
} 

2 - 靜態

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

B類持有未提及上流社會和我們這樣不需要任何附加的上下文但創造它無法訪問到本地(非靜態變量)。 所以調用內部類B:

value = 20; 

將使編譯時錯誤

0

更新答案:

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

+0

我試圖ContentManager $ DownloadJson()downloadJson =新ContentManager $ DownloadJson();但它不起作用... – Victor

+0

對不起,我的錯誤,這不適用於你。你應該調用'ContentManager.DownloadJson downloadJsonTask = contentManager.new DownloadJson();' – rastik

0

至少有2個解決方案:

1.您可以在ContentManager創建方法來創建DownloadJson類的實例。

public DownloadJson createDownloadJson() 
{ 
    return new DownloadJson(); 
} 

2.您可以創建DownloadJson作爲靜態類。之後,你可以在MyApp的類使用這個片段
DownloadJson downloadJson = new ContentManager.DownloadJson()

0

代替此行

ContentManager downloadJsonTask = new contentManager.DownloadJson();

使用本

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

它應該工作正常創建DownloadJson的新實例。

下面是一些更多的嵌套類(例如如何創建一個靜態嵌套類或內部類):http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html