2016-11-20 5 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/..."); 

    } 
} 

そしてここで、クラスファイル(ContentManagerに住んでいる私のAsyncTaskのコードは、です。メインアクティビティと同じパッケージフォルダにある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を宣言するには、2つの方法があります - 非静的

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; 

は私がContentManager $ DownloadJson =新しいContentManager $ DownloadJson(()downloadJsonを)しようとした時エラー

0

更新答え:

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

+0

をコンパイルするようになります。それは動作しません... – Victor

+0

申し訳ありません、私の間違い、これはあなたに当てはまりません。あなたは 'ContentManager.DownloadJson downloadJsonTask = contentManager.new DownloadJson();'を呼び出す必要があります。 – rastik

0

少なくとも2つの解決策があります。

1.あなたはDownloadJsonクラスのインスタンスを作成するためにContentManagerでメソッドを作成することができます。

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

2. DownloadJsonは静的クラスとして作成できます。その後、あなたはそれが必要この

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

が正常に動作します

ContentManager downloadJsonTask = new contentManager.DownloadJson();

使用このスニペット
DownloadJson downloadJson = new ContentManager.DownloadJson()

関連する問題