Rohit Mishra
Rohit Mishra

Reputation: 281

Make sure that activity starts after execution of async task

I want to make sure that my activity starts after execution of async task. As of now it gets started before the async task completes in background

This is where new activity is called. Before calling the new activity i am calling PagerAsyncTask. I want to make sure that new activity is called only after successful completion of PagerAsyncTask.

 protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        new PagerAsyncTask().execute();
            sharedPreferences = getSharedPreferences(Constants.MY_PREFS, 0);
            SharedPreferences.Editor editor = getSharedPreferences(Constants.MY_PREFS_NAME, MODE_PRIVATE).edit();
            editor.putBoolean("hasadd", false);
            editor.commit();
            Log.e("hi", "dsscdds");
            startActivity(new Intent(SplashScreenActivity.this, NavigationActivity.class));

PagerAsyncTask

   class PagerAsyncTask extends AsyncTask<String,Void,String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {
            StringBuilder sb=null;
            BufferedReader reader=null;
            String serverResponse=null;
            try {

                URL url = new URL("https://enigmatic-woodland-35608.herokuapp.com/pager.json");
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                connection.setConnectTimeout(5000);
                connection.setRequestMethod("GET");
                connection.connect();
                int statusCode = connection.getResponseCode();
                //Log.e("statusCode", "" + statusCode);
                if (statusCode == 200) {
                    sb = new StringBuilder();
                    reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                }

                connection.disconnect();
                if (sb!=null)
                    serverResponse=sb.toString();
                Log.e("haha", serverResponse);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            return serverResponse;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //All your UI operation can be performed here
            //Response string can be converted to JSONObject/JSONArray like
            try {
//String mr[] = new String[5];
                JSONObject response=new JSONObject(s);
                Iterator<?> keys = response.keys();
                int i=0;

                while( keys.hasNext() ) {

                    String key = (String)keys.next();
                    Log.e("hi",key);
                    Log.e("hey",response.getString(key));
//                    mr[i]=response.getString(key);
//                    Log.e("e=",mr[i]);
                    i++;

                }
                Log.e("I", String.valueOf(i));
                Iterator<?> keys1 = response.keys();
                mr = new String[i];
                int k=0;
                while ( keys1.hasNext() )
                {
                    String key = (String)keys1.next();
                    mr[k++]=response.getString(key);
                    Log.e("fdvfd",mr[k-1]);
                }
                for (int j=0;j<mr.length;j++)
                {
                    Log.e("dsd",mr[j]);
                }
                isComplete=true;
                setMr(mr);
                setSet(1);
                new RestaurantFragment().setmResources(mr);
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }

Upvotes: 1

Views: 44

Answers (2)

Shreyans
Shreyans

Reputation: 1061

There are a couple of ways to do this

1) use startActivity inside onPostExecute()

2)Pass activity reference to Async task and call some function in the activity from onPostExecute as show here

3)pass a function callback to AsyncTask as shown here. Though this is unnecessarily complicated for your task

Upvotes: 1

jonathanrz
jonathanrz

Reputation: 4296

You need to move the startActivity to the postExecute of the AsyncTask.

Your onCreate without the startActivity:

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    new PagerAsyncTask().execute();
    sharedPreferences = getSharedPreferences(Constants.MY_PREFS, 0);
    SharedPreferences.Editor editor = getSharedPreferences(Constants.MY_PREFS_NAME, MODE_PRIVATE).edit();
    editor.putBoolean("hasadd", false);
    editor.commit();
    Log.e("hi", "dsscdds");

The PagerAsyncTask onPostExecute:

@Override
protected void onPostExecute(String s) {
        super.onPostExecute(s);
        //All your UI operation can be performed here
        //Response string can be converted to JSONObject/JSONArray like
        try {
            JSONObject response=new JSONObject(s);
            Iterator<?> keys = response.keys();
            int i=0;

            while( keys.hasNext() ) {

                String key = (String)keys.next();
                Log.e("hi",key);
                Log.e("hey",response.getString(key));|
                i++;

            }
            Log.e("I", String.valueOf(i));
            Iterator<?> keys1 = response.keys();
            mr = new String[i];
            int k=0;
            while ( keys1.hasNext() )
            {
                String key = (String)keys1.next();
                mr[k++]=response.getString(key);
                Log.e("fdvfd",mr[k-1]);
            }
            for (int j=0;j<mr.length;j++)
            {
                Log.e("dsd",mr[j]);
            }
            isComplete=true;
            setMr(mr);
            setSet(1);
            new RestaurantFragment().setmResources(mr);
            startActivity(new Intent(SplashScreenActivity.this, NavigationActivity.class));
        } catch (JSONException e) {
            e.printStackTrace();
        }

Also, the code new RestaurantFragment().setmResources(mr); probably does nothing, since you are not attaching the fragment to anywhere

Upvotes: 1

Related Questions