在Activity中进行休息调用时不显示片段视图

时间:2018-05-23 07:22:51

标签: android fragment

  1. 我正在调用rest API,它从salesforce获取访问令牌。在我休息调用以从Salesforce获取数据并且我成功获取记录之后。并且所有记录都显示在android活动列表视图中。

  2. 之后我调用片段但片段视图没有显示。

  3. 如果我没有进行休息,则片段显示正确。

  4. 这是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 :(得分:0)

您需要在getAccountData内拨打AsyncTask功能。现在的实现是阻止你的UI线程,这就产生了我认为的问题。

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感到困惑,请考虑查看此answer here

答案 1 :(得分:0)

您正在阻止正在呈现UI的MainThread。 为了避免这种情况,android提供了AsyncTask让自己和其他人参与您的项目并使用Retrofit或其他库。它将为您节省大量时间并使您的代码更清晰。

Here你可以找到好文章。

如果您真的不想使用Retrofit,AsyncTask也可以选择