我只是使用一种简单的逻辑来获取联系人姓名(大家都可以使用if语句在下面的代码中看到)。但是,如果if语句不起作用。问题是我正在比较联系人s1字符串带有s2的名称,我从构造函数中获取它,并且我非常有信心s1包含与s2相同的名称。因此,它首先运行构造函数或在后台执行?。用这种方法。
private class findContacts extends AsyncTask<Void, String, String> {
String contactName;
public findContacts(String contactName) {
this.contactName = contactName;
}
@Override
protected String doInBackground(Void... voids) {
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
null,
null,
null);
String name = null,phoneNumber=null;
if (phones != null) {
while (phones.moveToNext())
{
name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
System.out.println("1st name "+name.toLowerCase()+" 2nd name"+contactName.toLowerCase()+" both are same ?"+name.toLowerCase().contains(contactName.toLowerCase()));
if (name.toLowerCase().equals(contactName.toLowerCase())){ // The problem lies here
System.out.println(name+" "+phoneNumber);
phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}else {
// newPhoneNum="123456";
}
}
phones.close();
}
return phoneNumber;
}
答案 0 :(得分:2)
AsyncTask#doInBackground()
仅在调用execute()
对象时被调用。那就是它异步工作的方式。它当然会在构造函数之后调用。在doInBackground
中调试代码。
注意:-您也可以像某些普通的非静态方法一样直接调用doInBackground()
,但这没有任何意义,因为这样就不会异步调用。
您的呼叫应为:
new findContacts ("Alice").execute()
。
类名应为FindContacts
而不是findContacts
(Java naming Conventions)。
答案 1 :(得分:1)
构造器内部的指令在实例化之后立即在所有其他指令之前执行。当执行异步任务时,将调用doInBackground。