Android 在OnCreate中未正确设置全局变量
我试图从用户的电话中提取联系人,然后将这些联系人与我在解析后端中的电话号码进行匹配,然后在自定义列表视图中显示匹配项。我已经成功地完成了几乎所有的事情,但是我很难正确设置全局变量mBinderPhoneNumber。无论出于何种原因,根据logcat,变量首先显示为null,直到后来才获得正确的值,即使我在使用变量之前正确设置了该变量。Android 在OnCreate中未正确设置全局变量,android,android-activity,android-runonuithread,Android,Android Activity,Android Runonuithread,我试图从用户的电话中提取联系人,然后将这些联系人与我在解析后端中的电话号码进行匹配,然后在自定义列表视图中显示匹配项。我已经成功地完成了几乎所有的事情,但是我很难正确设置全局变量mBinderPhoneNumber。无论出于何种原因,根据logcat,变量首先显示为null,直到后来才获得正确的值,即使我在使用变量之前正确设置了该变量。 以下是logcat,它显示变量最初显示为null,然后才正确设置: 有人能帮我吗? 活动内容如下: public class AddContacts
以下是logcat,它显示变量最初显示为null,然后才正确设置:
有人能帮我吗?
活动内容如下:
public class AddContactsActivity extends Activity {
public List mBinderPhoneNumbers;
Context context = null;
ContactsAdapter objAdapter;
ListView lv = null;
EditText edtSearch = null;
LinearLayout llContainer = null;
Button btnOK = null;
RelativeLayout rlPBContainer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
setContentView(R.layout.activity_add_contacts);
rlPBContainer = (RelativeLayout) findViewById(R.id.pbcontainer);
edtSearch = (EditText) findViewById(R.id.input_search);
llContainer = (LinearLayout) findViewById(R.id.data_container);
btnOK = (Button) findViewById(R.id.ok_button);
btnOK.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
getSelectedContacts();
}
});
edtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2,
int arg3) {
// When user changed the Text
String text = edtSearch.getText().toString()
.toLowerCase(Locale.getDefault());
objAdapter.filter(text);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
// Get parse users
String [] phoneNumberList = {"DUMMY NUMBER1", "DUMMY NUMBER2", "DUMMY NUMBER3", "DUMMY NUMBER4"};
ParseQuery<ParseUser> query = ParseUser.getQuery(); {
query.whereContainedIn("username", Arrays.asList(phoneNumberList));
query.findInBackground(new FindCallback<ParseUser>() {
public void done (List<ParseUser> list, ParseException e){
if (e == null) {
mBinderPhoneNumbers = list;
Log.d("TAG", "mBinderPhoneNumbers from onCreate: " + mBinderPhoneNumbers);
} else {
// Something went wrong.
Log.e("TAG", "User query error: " + e);
}
}
});
}
addContactsInList();
}
private void getSelectedContacts() {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer();
for (ContactObject bean : ContactsListClass.phoneList) {
if (bean.isSelected()) {
sb.append(bean.getName());
sb.append(",");
}
}
String s = sb.toString().trim();
if (TextUtils.isEmpty(s)) {
Toast.makeText(context, "Select at least one Contact",
Toast.LENGTH_SHORT).show();
} else {
s = s.substring(0, s.length() - 1);
Toast.makeText(context, "Selected Contacts: " + s,
Toast.LENGTH_SHORT).show();
}
}
private void addContactsInList() {
// TODO Auto-generated method stub
Thread thread = new Thread() {
@Override
public void run() {
showPB();
try {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
try {
ContactsListClass.phoneList.clear();
} catch (Exception e) {
}
while (phones.moveToNext()) {
Log.d("TAG", "mBinderPhoneNumbers from AddContactsInList:" + mBinderPhoneNumbers);
if (Arrays.asList(mBinderPhoneNumbers).contains(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER)))) {
String phoneName = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER));
String phoneImage = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
ContactObject cp = new ContactObject();
cp.setName(phoneName);
cp.setNumber(phoneNumber);
cp.setImage(phoneImage);
ContactsListClass.phoneList.add(cp);
}
}
phones.close();
lv = new ListView(context);
lv.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
llContainer.addView(lv);
}
});
Collections.sort(ContactsListClass.phoneList,
new Comparator<ContactObject>() {
@Override
public int compare(ContactObject lhs,
ContactObject rhs) {
return lhs.getName().compareTo(
rhs.getName());
}
});
objAdapter = new ContactsAdapter(AddContactsActivity.this,
ContactsListClass.phoneList);
lv.setAdapter(objAdapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,
View view, int position, long id) {
CheckBox chk = (CheckBox) view
.findViewById(R.id.contactcheck);
ContactObject bean = ContactsListClass.phoneList
.get(position);
if (bean.isSelected()) {
bean.setSelected(false);
chk.setChecked(false);
} else {
bean.setSelected(true);
chk.setChecked(true);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
hidePB();
}
};
thread.start();
}
void showPB() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
rlPBContainer.setVisibility(View.VISIBLE);
edtSearch.setVisibility(View.GONE);
btnOK.setVisibility(View.GONE);
}
});
}
void hidePB() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
rlPBContainer.setVisibility(View.GONE);
edtSearch.setVisibility(View.VISIBLE);
btnOK.setVisibility(View.VISIBLE);
}
});
}
}
公共类AddContactsActivity扩展活动{
公众电话号码列表;
Context=null;
接触式适配器;
ListView lv=null;
EditText-edtSearch=null;
LinearLayout llContainer=null;
按钮btnOK=null;
RelativeLayout rlPBContainer=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
上下文=这个;
setContentView(R.layout.activity\u add\u contacts);
rlPBContainer=(RelativeLayout)findViewById(R.id.pbcontainer);
edtSearch=(EditText)findViewById(R.id.input\u search);
llContainer=(LinearLayout)findViewById(R.id.data\u容器);
btnOK=(按钮)findviewbyd(R.id.ok_按钮);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
getSelectedContacts();
}
});
edtSearch.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列cs、int arg1、int arg2、,
int arg3){
//当用户更改文本时
String text=edtSearch.getText().toString()
.toLowerCase(Locale.getDefault());
objAdapter.filter(文本);
}
@凌驾
更改前的公共无效(字符序列arg0,int arg1,
整数arg2,整数arg3){
//TODO自动生成的方法存根
}
@凌驾
public void PostTextChanged(可编辑arg0){
//TODO自动生成的方法存根
}
});
//获取解析用户
字符串[]phoneNumberList={“虚拟数字1”、“虚拟数字2”、“虚拟数字3”、“虚拟数字4”};
ParseQuery=ParseUser.getQuery(){
query.whereContainedIn(“用户名”,Arrays.asList(phoneNumberList));
findInBackground(新的FindCallback(){
公共作废完成(列表,异常解析){
如果(e==null){
mBinderPhoneNumbers=列表;
Log.d(“TAG”,“onCreate中的MbinderPhoneNumber:+MbinderPhoneNumber”);
}否则{
//出了点问题。
Log.e(“标签”,“用户查询错误:+e”);
}
}
});
}
addContactsInList();
}
私有void getSelectedContacts(){
//TODO自动生成的方法存根
StringBuffer sb=新的StringBuffer();
for(ContactObject bean:ContactsListClass.phoneList){
if(bean.isSelected()){
sb.append(bean.getName());
某人加上(“,”);
}
}
字符串s=sb.toString().trim();
如果(TextUtils.isEmpty){
Toast.makeText(上下文,“选择至少一个联系人”,
吐司。长度(短)。show();
}否则{
s=s.substring(0,s.length()-1);
Toast.makeText(上下文,“选定联系人:+s,
吐司。长度(短)。show();
}
}
私有void addContactsInList(){
//TODO自动生成的方法存根
线程线程=新线程(){
@凌驾
公开募捐{
showPB();
试一试{
Cursor=getContentResolver().query(
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,
空,空,空,空);
试一试{
ContactsListClass.phoneList.clear();
}捕获(例外e){
}
while(phones.moveToNext()){
Log.d(“标记”,“来自AddContactsInList的MbinderPhoneNumber:”+MbinderPhoneNumber);
if(Arrays.asList(mbinderPhoneNumber).contains(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NORMALIZED_NUMBER))){
String phoneName=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.DISPLAY_NAME));
String phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NORMALIZED_NUMBER));
String phoneImage=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.CONTACT_ID));
ContactObject cp=新的ContactObject();
cp.setName(phoneName);
cp.setNumber(电话号码);
cp.setImage(phoneImage);
ContactsListClass.phoneList.add(cp);
}
}
电话。关闭();
lv=新列表视图(上下文);
lv.setLayoutParams(新的LayoutParams(
LayoutParams.MATCH_父级,
public class AddContactsActivity extends Activity {
public List mBinderPhoneNumbers;
Context context = null;
ContactsAdapter objAdapter;
ListView lv = null;
EditText edtSearch = null;
LinearLayout llContainer = null;
Button btnOK = null;
RelativeLayout rlPBContainer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
setContentView(R.layout.activity_add_contacts);
rlPBContainer = (RelativeLayout) findViewById(R.id.pbcontainer);
edtSearch = (EditText) findViewById(R.id.input_search);
llContainer = (LinearLayout) findViewById(R.id.data_container);
btnOK = (Button) findViewById(R.id.ok_button);
btnOK.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
getSelectedContacts();
}
});
edtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2,
int arg3) {
// When user changed the Text
String text = edtSearch.getText().toString()
.toLowerCase(Locale.getDefault());
objAdapter.filter(text);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
// Get parse users
String [] phoneNumberList = {"DUMMY NUMBER1", "DUMMY NUMBER2", "DUMMY NUMBER3", "DUMMY NUMBER4"};
ParseQuery<ParseUser> query = ParseUser.getQuery(); {
query.whereContainedIn("username", Arrays.asList(phoneNumberList));
query.findInBackground(new FindCallback<ParseUser>() {
public void done (List<ParseUser> list, ParseException e){
if (e == null) {
mBinderPhoneNumbers = list;
Log.d("TAG", "mBinderPhoneNumbers from onCreate: " + mBinderPhoneNumbers);
} else {
// Something went wrong.
Log.e("TAG", "User query error: " + e);
}
}
});
}
addContactsInList();
}
private void getSelectedContacts() {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer();
for (ContactObject bean : ContactsListClass.phoneList) {
if (bean.isSelected()) {
sb.append(bean.getName());
sb.append(",");
}
}
String s = sb.toString().trim();
if (TextUtils.isEmpty(s)) {
Toast.makeText(context, "Select at least one Contact",
Toast.LENGTH_SHORT).show();
} else {
s = s.substring(0, s.length() - 1);
Toast.makeText(context, "Selected Contacts: " + s,
Toast.LENGTH_SHORT).show();
}
}
private void addContactsInList() {
// TODO Auto-generated method stub
Thread thread = new Thread() {
@Override
public void run() {
showPB();
try {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
try {
ContactsListClass.phoneList.clear();
} catch (Exception e) {
}
while (phones.moveToNext()) {
Log.d("TAG", "mBinderPhoneNumbers from AddContactsInList:" + mBinderPhoneNumbers);
if (Arrays.asList(mBinderPhoneNumbers).contains(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER)))) {
String phoneName = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER));
String phoneImage = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
ContactObject cp = new ContactObject();
cp.setName(phoneName);
cp.setNumber(phoneNumber);
cp.setImage(phoneImage);
ContactsListClass.phoneList.add(cp);
}
}
phones.close();
lv = new ListView(context);
lv.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
llContainer.addView(lv);
}
});
Collections.sort(ContactsListClass.phoneList,
new Comparator<ContactObject>() {
@Override
public int compare(ContactObject lhs,
ContactObject rhs) {
return lhs.getName().compareTo(
rhs.getName());
}
});
objAdapter = new ContactsAdapter(AddContactsActivity.this,
ContactsListClass.phoneList);
lv.setAdapter(objAdapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,
View view, int position, long id) {
CheckBox chk = (CheckBox) view
.findViewById(R.id.contactcheck);
ContactObject bean = ContactsListClass.phoneList
.get(position);
if (bean.isSelected()) {
bean.setSelected(false);
chk.setChecked(false);
} else {
bean.setSelected(true);
chk.setChecked(true);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
hidePB();
}
};
thread.start();
}
void showPB() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
rlPBContainer.setVisibility(View.VISIBLE);
edtSearch.setVisibility(View.GONE);
btnOK.setVisibility(View.GONE);
}
});
}
void hidePB() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
rlPBContainer.setVisibility(View.GONE);
edtSearch.setVisibility(View.VISIBLE);
btnOK.setVisibility(View.VISIBLE);
}
});
}
}
query.findInBackground(new FindCallback<ParseUser>() {
public void done (List<ParseUser> list, ParseException e){
if (e == null) {
mBinderPhoneNumbers = list;
addContactsInList();// call here
Log.d("TAG", "mBinderPhoneNumbers from onCreate: " + mBinderPhoneNumbers);
} else {
// Something went wrong.
Log.e("TAG", "User query error: " + e);
}
}
});
query.findInBackground(new FindCallback<ParseUser>() {
public void done (List<ParseUser> list, ParseException e){
if (e == null) {
mBinderPhoneNumbers = list;
addContactsInList();
.....
}
}
});