当正常 运行 程序时,我没有得到联系人姓名。但是当我在所有语句中插入调试点时,就会自动添加联系人

I am not gettting contacts name when Normally run program. But when i insert debug point at all statement then automatically the contacts are added

看看这个代码片段。在这里,我使用 AsyncTask 在后台获取联系方式。当我只是 运行 时,我没有得到任何东西,但是当我搜索某个联系人时,它会显示所有联系人。但是在搜索任何联系人之前,我无法获取联系人列表。请帮助我在搜索之前获取所有联系人。

提前致谢

public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {

public List<MyModel> modelData = new ArrayList<>();
RecyclerView mRecyclerView;
ProgressDialog dialog;
SimpleCursorAdapter mAdapter;
MyAdapter adapter;
MatrixCursor mMatrixCursor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    dialog = new ProgressDialog(this);
    mMatrixCursor = new MatrixCursor(new String[]{"_id", "name", "details"});
    mAdapter = new SimpleCursorAdapter(getBaseContext(),
            R.layout.contacts_row,
            null,
            new String[]{"name", "details"},
            new int[]{R.id.tv_name, R.id.phone_number}, 0);


    MyAsyncTask myAsyncTask = new MyAsyncTask();
    myAsyncTask.execute();


    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    for (MyModel model : modelData) {
        Log.e("model 2", model.getName());
    }

    if (modelData.size() == 0) {
        Log.e("Size", "Empty");
    }

    adapter = new MyAdapter(MainActivity.this, modelData);
    mRecyclerView.setAdapter(adapter);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

}


@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {


    final List<MyModel> filteredModelList = filter(modelData, newText);
    adapter.animateTo(filteredModelList);
    mRecyclerView.scrollToPosition(0);
    return true;
}

private List<MyModel> filter(List<MyModel> models, String query) {
    query = query.toLowerCase();

    final List<MyModel> filteredModelList = new ArrayList<>();
    for (MyModel model : models) {
        final String text = model.getName().toLowerCase();
        if (text.contains(query)) {
            filteredModelList.add(model);
        }
    }
    return filteredModelList;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);

    final MenuItem item = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    /*if (id == R.id.action_settings) {
        return true;
    }*/

    return super.onOptionsItemSelected(item);
}

public class MyAsyncTask extends AsyncTask<Void, Void, Void> {


   /* @Override
    protected Void doInBackground(Void... params) {
        return null;
    }*/

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog.show();
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        dialog.dismiss();
    }

    @Override
    protected Void doInBackground(Void... params) {

        Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;

        // Querying the table ContactsContract.Contacts to retrieve all the contacts

        Cursor contactsCursor = getContentResolver().query(contactsUri, null, null, null,
                ContactsContract.Contacts.DISPLAY_NAME + " ASC ");

        if (contactsCursor.moveToFirst()) {
            do {
                long contactId = contactsCursor.getLong(contactsCursor.getColumnIndex("_ID"));
                Log.e("Contact Id ", "" + contactId);
                Uri dataUri = ContactsContract.Data.CONTENT_URI;
                Log.e("Contact URI ", "" + dataUri);
                // Querying the table ContactsContract.Data to retrieve individual items like
                // home phone, mobile phone, work email etc corresponding to each contact
                Cursor dataCursor = getContentResolver().query(dataUri, null,
                        ContactsContract.Data.CONTACT_ID + "=" + contactId,
                        null, null);

                String displayName = "";
                String homePhone = "";
                String mobilePhone = "";
                String workPhone = "";


                if (dataCursor.moveToFirst()) {
                    // Getting Display Name
                    displayName = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
                    //modelData.add(new MyModel(displayName));
                    Log.e("DisplayName ", displayName);

                    do {
                        if (dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
                            switch (dataCursor.getInt(dataCursor.getColumnIndex("data2"))) {
                                case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
                                    homePhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
                                    break;
                                case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
                                    mobilePhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
                                    break;
                                case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
                                    workPhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
                                    break;
                            }
                        }
                    } while (dataCursor.moveToNext());
                    String details = "";

                    // Concatenating various information to single string
                    if (homePhone != null && !homePhone.equals(""))
                        details = "HomePhone : " + homePhone + "\n";
                    if (mobilePhone != null && !mobilePhone.equals(""))
                        details += "MobilePhone : " + mobilePhone + "\n";
                    if (workPhone != null && !workPhone.equals(""))
                        details += "WorkPhone : " + workPhone + "\n";
                    Log.e("Details ", details);
                    mMatrixCursor.addRow(new Object[]{Long.toString(contactId), displayName, details});
                    modelData.add(new MyModel(displayName, details));

                }

            } while (contactsCursor.moveToNext());
        }
            contactsCursor.close();
            for (MyModel model : modelData) {
                Log.e("model for loop ", model.getName() + " " + model.getPhoneNumber());
            }
            return null;

        }
    }
}

这是因为当您在 AsyncTask 之前设置适配器时,它在单独的线程中执行。因为你的任务还没有完成

将您的代码移至 AsyncTask

onPostExecute 中的 setAdapter
@Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
 adapter = new MyAdapter(MainActivity.this, modelData);
    mRecyclerView.setAdapter(adapter);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        dialog.dismiss();
    }