Harish
Harish

Reputation: 1

Fragment View Not Displayed while making rest call in Activity

  1. I am calling rest API which gets access token from salesforce. after I make a rest call to get data from Salesforce and I'm successfully getting records. and all records are shown in android activity list view.

  2. after that I call fragment but fragment view is not showing.

  3. if I'm not making rest call then fragment show properly.

Here is the MainActivity class

public class MainActivity extends AppCompatActivity {
DrawerLayout dLayout;
private ArrayAdapter<String> listAdapter;
ProgressDialog progressDialog;
JSONTokener tokener;
String accessToken_, instanceURL_;
JSONArray finalResult;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setNavigationDrawer(); // call method
    //   button_save_account = (Button) findViewById(R.id.button_save_account);
    accessToken_ = "00D7F000005oJve!ARUAQPJ8hMWibtO1flIPjZfzV4A__Kzj6wTjJ5XA_xE1zbqDs_0fOTZuxJFiLVxsFx_kNPxuNNK6c7yREtbxq4J7W1oWuUEs";
    instanceURL_ = "https://harishgakhar40-dev-ed.my.salesforce.com";
    // Create list adapter
    listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>());
    ((ListView) findViewById(R.id.contacts_list)).setAdapter(listAdapter);
    try {
        MyAsyncTasks myAsyncTasks = new MyAsyncTasks();
        myAsyncTasks.execute(accessToken_, instanceURL_).get();

    } catch (Exception e) {

    }
}

private void setNavigationDrawer() {
    dLayout = (DrawerLayout) findViewById(R.id.drawer_layout); // initiate a DrawerLayout
    NavigationView navView = (NavigationView) findViewById(R.id.navigation); // initiate a Navigation View

    navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
            Fragment frag = null; // create a Fragment Object
            int itemId = menuItem.getItemId(); // get selected menu item's id
            if (itemId == R.id.first) {
                frag = new InsertRecords();
                Bundle bundle = new Bundle();
                bundle.putString("access token", accessToken_);
                bundle.putString("instanc url", instanceURL_);
                frag.setArguments(bundle);
            } else if (itemId == R.id.second) {
                Log.v("fragment second ---- ", "In Fragment Second ----  ");
                frag = new SecondFragment();
            } else if (itemId == R.id.third) {
                frag = new ThirdFragment();
            }
            Toast.makeText(getApplicationContext(), menuItem.getTitle(), Toast.LENGTH_SHORT).show();
            if (frag != null) {
                Log.v("frag ---- ", "frag ------ " + frag);
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Log.v("transaction ---- ", "transaction ------ " + frag);
                transaction.replace(R.id.frame, frag); // replace a Fragment with Frame Layout
                transaction.commit(); // commit the changes
                dLayout.closeDrawers(); // close the all open Drawer Views
                return true;
            }
            return false;
        }
    });
}

public class MyAsyncTasks extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // display a progress dialog for good user experiance
        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setMessage("Please Wait");
        progressDialog.setCancelable(false);
        progressDialog.setMessage("Loading...");
        progressDialog.show();
    }

    @Override
    protected String doInBackground(String... params) {
        String accessToken = params[0];
        String instanceURL = params[1];
        // implement API in background and store the response in current variable
        String result = "";
        DefaultHttpClient client = new DefaultHttpClient();
        String url = instanceURL + "/services/data/v20.0/query/?q=";
        String soqlQuery = "Select Id, Name, BillingStreet, BillingCity, BillingState From Account Limit 10 ";
        try {
            url += URLEncoder.encode(soqlQuery, "UTF-8");
        } catch (UnsupportedEncodingException e) {
        }

        HttpGet getRequest = new HttpGet(url);
        getRequest.addHeader("Authorization", "OAuth " + accessToken);
        Log.v("Token in doin ----  ", "accessToken ---- in doin ----  " + accessToken);
        Log.v("instanceURL doin ----  ", "instanceURL ---- in doin ----  " + instanceURL);
        try {
            HttpResponse response = client.execute(getRequest);

            result = EntityUtils.toString(response.getEntity());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        try {
            progressDialog.dismiss();
            // dismiss the progress dialog after receiving data from API
            JSONObject object = (JSONObject) new JSONTokener(result).nextValue();
            JSONArray records = object.getJSONArray("records");

            // globalState.setAccountNames(new String[records.length()]);
            // globalState.setAccounts(new JSONObject[records.length()]);
            listAdapter.clear();
            for (int i = 0; i < records.length(); i++) {
                JSONObject record = (JSONObject) records.get(i);
                String accountName = record.getString("Name");
                Log.v("accountName---- ", "accountName ---- " + accountName);
                listAdapter.add(accountName);
                //  globalState.getAccountNames()[i] = accountName;
                //globalState.getAccounts()[i] = record;
            }

        } catch (Exception e) {

        }
        Log.d("data", result.toString());
    }
}

}

Upvotes: 0

Views: 98

Answers (2)

Samuel Bil&#253;
Samuel Bil&#253;

Reputation: 43

You are blocking MainThread which is rendering UI. To avoid this, android provides AsyncTask. BUT make yourself and others working on your project favor and use Retrofit or other libraries. It will save you so much time and make your code cleaner.

Here you can find a good article.

If you really don't feel like using Retrofit, AsyncTask is an option too

Upvotes: 1

Reaz Murshed
Reaz Murshed

Reputation: 24211

You need to call your getAccountData function inside an AsyncTask. The implementation right now is blocking your UI thread, which created the problem I think.

public class GetAccountData implements AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        // Get account data here. 
    }

    @Override
    protected void onPostExecute(final String accountName) {
        // Pass the accountName to the calling Activity here. 
    }

    // Implement other methods if you need
}

If you are confused about how you can pass the data from your AsyncTask to your Activity, please consider looking into this answer here.

Upvotes: 0

Related Questions