2016-05-05 5 views
1

これは初めてのAndroidコードの書き方です。AsyncTaskは、これらのデータに応じてボタンを作成した後にデータを要求します。

MainActivityでは、AsyncTaskを使用してボタンを作成するための「カテゴリ」リストを要求します。 MainActivityボタンをクリックして、GetProductsActivityにリダイレクトして、追加のString "Category(飲み物)"を表示します。 GetProductsActivityでは、「カテゴリ」を使用してサーバーに再度要求し、「製品」リストを取得して製品ボタンを作成します。

問題は次のとおりです。まずコードを作成するボタンをクリックしてから、AsyncTaskリクエストサーバーが「製品」リストを取得するように、ボタンを作成する前に「製品」リストを取得します。私は何をすべきか?

"orga.getAttributes"は、サーバーを要求する関数です。ここ はここMainActivity

public class MainActivity extends AppCompatActivity { 
    private ArrayList<String> data = new ArrayList<String>(); 
    List<String> attributes = new ArrayList<String>(); 
    List<String> categoryList = new ArrayList<String>(); 
    final Organisation orga = Organisation.getInstance(); 
    private class CallSocketTask extends AsyncTask<Integer, Integer, String> { 

     protected String doInBackground(Integer... nochnix) { 

      orga.SetInit(); 
      categoryList = orga.getAttributes(orga.GET_CATEGORIES,null,true); 

      return null; 
     } 

     protected void onPostExecute(String string) { 
      //attributes = orga.getAttributes(orga.GET_PRODUCTS_BY_CATEGORY,null,true); 
     } 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     new CallSocketTask().execute();//orga.stop(); 
     //requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
     setContentView(R.layout.activity_main); 
     LinearLayout layer = (LinearLayout) findViewById(R.id.layer); 
     //getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.activity_main); 
     for(int i=0; i < categoryList.size(); i++) 
     { 
      Button button = new Button(this); 
      button.setId(i); 
      final String category = categoryList.get(i); 
      button.setText(category); 
      //click action 
      View.OnClickListener productHandler = new View.OnClickListener(){ 
       public void onClick(View v) { 
        // doStuff 
        Intent intentMain = new Intent(MainActivity.this , 
          GetProductsActivity.class); 
        intentMain.putExtra("categroy",category); 
        MainActivity.this.startActivity(intentMain); 
        Log.i("Content "," Main layout Click to Get Products by Category"); 

       } 
      }; 
      button.setOnClickListener(productHandler); 
      layer.addView(button); 
     } 
    } 
} 

あるGetProductsActivity

public class GetProductsActivity extends AppCompatActivity{ 
    private ArrayList<String> data = new ArrayList<String>(); 
    List<String> attributes = new ArrayList<String>(); 
    final Organisation orga = Organisation.getInstance(); 
    String category; 

    private class CallSocketTask extends AsyncTask<Integer, Integer, String> { 


     protected String doInBackground(Integer... nochnix) { 
      Bundle extras = getIntent().getExtras(); 
      if (extras != null) { 
       category = extras.getString("categroy"); 
       Log.i("Category Selected",category); 
      } 
      //orga.SetInit(); 
      attributes = orga.getAttributes(orga.GET_PRODUCTS_BY_CATEGORY,category); 
      Log.i("Product number ",attributes.size()+""); 
      //attributes = orga.getAttributes("getProducts","getCategories","Orangensaft"); 
      return null; 
     } 

     protected void onPostExecute(String string) { 
      //Log.i("Result ",""); 
     } 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //this.notifyAll(); 
     CallSocketTask myTask = new CallSocketTask(); 
     myTask.execute();//orga.stop(); 
     setContentView(R.layout.get_products); 
     LinearLayout layer = (LinearLayout) findViewById(R.id.productsLayer); 
     //getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.activity_main); 
     //Bundle extras = getIntent().getExtras(); 
     //data= extras.getStringArrayList("products"); 
     Log.i("Product number OnCreate",attributes.size()+""); 
     for(int i=0; i < attributes.size(); i++) 
     { 
      Log.i("Product",attributes.get(i)); 
      Button button = new Button(this); 
      button.setId(i); 
      button.setText(attributes.get(i)); 

      layer.addView(button); 
     } 
    } 
} 

答えて

0
がonPostExecuteにボタンを設定するためのコードを動かし

です。

+0

これは問題、その新しいボタン(this)、 "this"をどのように処理するかを引き起こします。 –

+0

これは状況に応じて最も適切な答えだと思います。そして那玉に答えるには、この例では 'new Button(MainActivity.this) 'を呼び出すことができます。 'onPostExecute()'はメインスレッド上で実行されることに留意してください。ここから長いブロック作業を実行しないでください。 – dbm

+0

はい、そうです。ありがとう。 –

0

問題を簡単に解決してください:onCreate()関数でThread.sleep()を使用すると、ループボタンはAsyncTaskの実行を待つことができます。

+0

私は本当にこのアイデアに対して助言するでしょう: 'onCreate()'はメインスレッド上で動作し、決してメインスレッドをブロックしてはいけません。それから、タスクが完了するのを待つより良い方法があるので、最後の手段であるはずの 'Thread.sleep()'もあります。 – dbm

+0

はい、あなたは正しいです。 –

0

非静的内部AsyncTaskによってメモリリークが発生する可能性があります。gotchasを確認してください。

Thread.sleep()は悪い方法です。リクエスト "カテゴリ"がネットワークの問題のため長く実行される場合はどうなりますか?

ボタンは、onPostExecute()で呼び出されるYourActivity.createButtons()メソッドで作成できます。

+0

はい、あなたは正しいです。 –

関連する問題