Search code examples
androidandroid-asynctaskoncreate

AsyncTask request data later than I create button depending on these data


This is my first time to write Android code and I am stark with a problem.

In the MainActivity, I use AsyncTask to request "Category" list to create buttons. The MainActivity buttons can be clicked and it redirects to GetProductsActivity with an extras String "Category(e.g.drink)". In the GetProductsActivity, I request server again using "Category" to get "Products" list to create product button.

Here is the problem: the code create button first, then AsyncTask request server to get "Products" list, I want to get the "Products" list before creating the button. What should I do?

"orga.getAttributes" is the function to request server. Here is 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);
        }
    }
}

Here is the 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);
        }
    }
}

Solution

  • Move your code for setting up the buttons into onPostExecute.