Представление фрагмента не отображается во время вызова покоя в Activity - PullRequest
0 голосов
/ 23 мая 2018
  1. Я вызываю оставшийся API, который получает токен доступа от Salesforce.после того, как я позвоню отдыхать, чтобы получить данные от Salesforce, и я успешно получаю записи.и все записи отображаются в виде списка активности Android.

  2. после этого я вызываю фрагмент, но представление фрагмента не отображается.

  3. если я 'm не делает вызов покоя, тогда фрагмент покажется правильно.

Вот класс MainActivity

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());
    }
}

}

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы блокируете MainThread, который обрабатывает пользовательский интерфейс.Чтобы избежать этого, Android предоставляет AsyncTask. НО заставьте себя и других работать над вашим проектом и использовать Дооснащение или другую библиотеку.Это сэкономит вам много времени и сделает ваш код чище.

Здесь вы можете найти хорошую статью.

Если вы действительно не хотите использовать Retrofit, AsyncTask тоже вариант

0 голосов
/ 23 мая 2018

Вам нужно вызвать вашу getAccountData функцию внутри AsyncTask.Реализация прямо сейчас блокирует ваш поток пользовательского интерфейса, который создал проблему, я думаю.

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
}

Если вы не уверены, как передать данные из вашего AsyncTask в Activity, рассмотрите этот ответ здесь .

...