我开发了一个类似于聊天应用程序的Android客户端,该应用程序显示使用相同应用程序的用户的联系人列表。
问题在于加载联系人列表太慢了。这是我申请的主页。
我使用Aysnc任务并在后台运行繁重的操作(仅在主线程中运行与UI相关的任务),还使用HTTP请求使用 GET 和执行与服务器相关的任务POST 即可。
我使用 php 和 mysql 进行服务器集成。请帮助我找到延迟将联系人加载到我的客户端应用程序的原因的解决方案。
请回复。
答案 0 :(得分:0)
Thread
应该为你做。
这看起来像这样:
public void somemethod(){
Thread t = new Thread() {
public void run() {
doyourTask();
}
};
t.start();
}
答案 1 :(得分:0)
package com.dextrols.bol_messanger.fragments;
import static com.dextrols.bol_messanger.pushnotifications.CommonUtilities.DISPLAY_MESSAGE_ACTION;
import static com.dextrols.bol_messanger.pushnotifications.CommonUtilities.EXTRA_MOBILE_NUMBER;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.provider.Contacts.People;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.PhoneLookup;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.dextrols.bol_messanger.fragments.Profile_Settings_Child_Fragment.Load_All;
import com.dextrols.bol_messanger.invite_utils.Invite_Activity;
import com.dextrols.bol_messanger.pushnotifications.AlertDialogManager;
import com.dextrols.bol_messanger.pushnotifications.ConnectionDetector;
import com.dextrols.bol_messanger.pushnotifications.JSONParser;
import com.dextrols.bol_messanger.pushnotifications.R;
import com.dextrols.bol_messanger.pushnotifications.WakeLocker;
import com.dextrols.bol_messanger.utils.Database_Handler_Number;
import com.google.android.gcm.GCMRegistrar;
public class Contacts_Fragment extends Activity implements OnScrollListener {
ProgressDialog pDialog;
String mPhoto_Uri,mName,mphoneNumber,audio_url_chat = "";
ArrayList<String>Chat_List_Array = new ArrayList<String>();
Database_Handler_Number mDatabase_Number;
public static String Mobile_Number_Db="",country_db="",gcm_id_db="";
String mDb_Numbers;
ArrayList<String> mDb_Numbers_Array = new ArrayList<String>();
JSONParser jParser = new JSONParser();
String url = "*url_link_here*";
JSONArray products = null,products1 = null;;
String m_mobile_number;
ListView lv;
TextView no_contacts_text;
HashMap<String, String> map_app_contacts;
ArrayList<HashMap<String, String>> m_hash_list = new ArrayList<HashMap<String,String>>();
private static String url_chat_list_single = "*url_here*";
public static String ID = "name";
public static String NUMBER = "mobile_number";
public static String IMAGE = "profile_image";
public static String GCM_ID = "gcm_regid";
public static String NAME = "name";
public static String Audio = "audio_url";
private ArrayList<String> mContacts_Array = new ArrayList<String>();
private ArrayList<String> mNumbers = new ArrayList<String>();
public static ArrayList<String> mChat_Array = new ArrayList<String>();
String [] web_voice;
private static final String TAG = "success";
String audio_url_recive="",mContact_Number="";
int success ;
int size_chat;
String count;
int digits = 10;
// ImageView mAdd_Contact;
String [] mContact_Names;
String [] mContact_Numbers;
String [] mContact_Images;
String [] mContact_GcmId;
String [] mMessage_Count;
ArrayList<String> mContacts_Names_Array = new ArrayList<String>();
ArrayList<String> mContacts_Numbers_Array = new ArrayList<String>();
ArrayList<String> mContacts_Images_Array = new ArrayList<String>();
public static ArrayList<String> mContacts_Gcmid_Array = new ArrayList<String>();
RelativeLayout screen;
private ActionBar actionBar;
CustomListAdapter adapter;
TextView mConnection_Note;
String mNotification_Number="";
AlertDialogManager alert = new AlertDialogManager();
ConnectionDetector cd;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_contacts);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
actionBar = getActionBar();
// Hide the action bar title
actionBar.setDisplayShowTitleEnabled(false);
cd = new ConnectionDetector(getApplicationContext());
actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ef343e")));
mDatabase_Number = new Database_Handler_Number(Contacts_Fragment.this);
mDatabase_Number.open();
Cursor getdetails=mDatabase_Number.getlistitems();
if(getdetails.getCount()>0){
if(getdetails.moveToFirst())
{
do{
Mobile_Number_Db = getdetails.getString(1);
Log.d("Db Mobile Number",""+Mobile_Number_Db);
country_db = getdetails.getString(2);
Log.d("Db Country",""+country_db);
gcm_id_db = getdetails.getString(3);
Log.d("Db GCM ID",""+gcm_id_db);
}while(getdetails.moveToNext());
}
}else{
}
mDatabase_Number.close();
mContacts_Array.clear();
mNumbers.clear();
mChat_Array.clear();
getNumber(getApplicationContext().getContentResolver());
mConnection_Note = (TextView)findViewById(R.id.connection_note);
Internetchecker();
if (!cd.isConnectingToInternet()) {
} else {
new Load_All_Numbers().execute();
}
lv = (ListView)findViewById(R.id.contacts_list);
screen = (RelativeLayout)findViewById(R.id.contact_screen);
no_contacts_text = (TextView)findViewById(R.id.no_contact_text);
registerReceiver(mHandleMessageReceiver, new IntentFilter(DISPLAY_MESSAGE_ACTION));
}
/**
* Receiving push messages
* */
private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Waking up mobile if it is sleeping
WakeLocker.acquire(Contacts_Fragment.this);
mNotification_Number = intent.getExtras().getString(EXTRA_MOBILE_NUMBER);
mNotification_Number = mNotification_Number.replace("[", "");
mNotification_Number = mNotification_Number.replace("]", "");
mNotification_Number = mNotification_Number.replace("\"", "");
Log.d("Number",""+mNotification_Number);
String mContact_Save = getContactName(context, mNotification_Number);
if (mContact_Save != null && !mContact_Save.isEmpty()) {
mContacts_Array.clear();
mNumbers.clear();
mChat_Array.clear();
Chat_List_Array.clear();
getNumber(getApplicationContext().getContentResolver());
new Load_All_Numbers().execute();
} else {
final Dialog dialog = new Dialog(Contacts_Fragment.this/*,android.R.style.Theme_Translucent*/);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCanceledOnTouchOutside(true);
dialog.setContentView(R.layout.new_contact_save);
dialog.show();
final EditText mContact_Name = (EditText)dialog.findViewById(R.id.new_contact_name);
final TextView mContact_Submit = (TextView)dialog.findViewById(R.id.new_contact_submit);
mContact_Submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mContact_Name.getText().toString().trim().equals("")) {
Toast.makeText(getApplicationContext(), "Required fields missing..!", Toast.LENGTH_SHORT).show();
} else {
dialog.dismiss();
createContact(mContact_Name.getText().toString(), mNotification_Number);
mContacts_Array.clear();
mNumbers.clear();
mChat_Array.clear();
Chat_List_Array.clear();
getNumber(getApplicationContext().getContentResolver());
new Load_All_Numbers().execute();
}
}
});
}
// Releasing wake lock
WakeLocker.release();
}
};
@Override
public void onDestroy() {
try {
unregisterReceiver(mHandleMessageReceiver);
GCMRegistrar.onDestroy(getApplicationContext());
} catch (Exception e) {
Log.e("UnRegister Receiver Error", "> " + e.getMessage());
}
super.onDestroy();
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
private void getNumber(ContentResolver cr) {
Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, Phone.DISPLAY_NAME+ " ASC");
while (phones.moveToNext())
{
mName=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
System.out.println("................."+mName);
mphoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
System.out.println(".................."+mphoneNumber);
mphoneNumber = mphoneNumber.replaceAll("^0+", "");
Log.i("Zero",""+mphoneNumber);
mphoneNumber = mphoneNumber.replaceAll(" ", "").replace("(","").replace(")", "").replace("-", "").replace("+91", "");
Log.d("Replaced Braces",""+mphoneNumber);
mContacts_Array.add(mphoneNumber);
}
phones.close();// close cursor
}
class Load_All_Numbers extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... args) {
// TODO Auto-generated method stub
List<NameValuePair> params = new ArrayList<NameValuePair>();
// getting JSON string from URL
JSONObject json = jParser.makeHttpRequest(url, "GET", params);
try {
// Checking for SUCCESS TAG
int success = json.getInt("success");
if (success == 1) {
// products found
// Getting Array of Products
products = json.getJSONArray("data");
// looping through All Products
for (int i = 0; i < products.length(); i++) {
JSONObject c = products.getJSONObject(i);
m_mobile_number = c.getString("mobile_number");
mNumbers.add(m_mobile_number);
}
} else {
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
mContacts_Names_Array.clear();
mContacts_Images_Array.clear();
mContacts_Gcmid_Array.clear();
mContacts_Numbers_Array.clear();
List<String> intersection = new ArrayList(mContacts_Array);
intersection.retainAll(mNumbers);
if (intersection.size()>0) {
new Get_Chat().execute();
new Get_Each_Contacts().execute();
no_contacts_text.setVisibility(View.INVISIBLE);
} else {
no_contacts_text.setVisibility(View.VISIBLE);
}
}
}
class Get_Chat extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... args) {
List<String> intersection = new ArrayList(mContacts_Array);
intersection.retainAll(mNumbers);
for ( String key_chat : intersection){
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("from_number", key_chat));
params.add(new BasicNameValuePair("to_number", Mobile_Number_Db));
JSONObject json = jParser.makeHttpRequest(url_chat_list_single, "GET", params);
try {
size_chat = json.getInt("size");
count = Integer.toString(size_chat);
Chat_List_Array.add(count);
Log.d("Size Array",""+Chat_List_Array);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
class Get_Each_Contacts extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... args) {
try {
List<String> union = new ArrayList(mContacts_Array);
union.addAll(mNumbers);
List<String> intersection = new ArrayList(mContacts_Array);
intersection.retainAll(mNumbers);
List<String> symmetricDifference = new ArrayList(union);
symmetricDifference.removeAll(intersection);
for ( String key : intersection){
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("mobile_number", key));
JSONObject jobj = jParser.makeHttpRequest("http://bolmessenger.com/voice_droid/single_user.php", "GET", params);
try {
// Checking for SUCCESS TAG
int success = jobj.getInt("success");
if (success == 1) {
// products found
// Getting Array of Products
products1 = jobj.getJSONArray("single_login");
for (int i = 0; i < products1.length(); i++) {
JSONObject j = products1.getJSONObject(i);
mContacts_Names_Array.add(getContactName(getApplicationContext(), key));
mContacts_Numbers_Array.add(j.getString("mobile_number"));
mContacts_Images_Array.add(j.getString("profile_image"));
mContacts_Gcmid_Array.add(j.getString("gcm_regid"));
mContact_Names = new String [mContacts_Names_Array.size()];
for (int k = 0; k < mContacts_Names_Array.size(); k++) {
mContact_Names[k] = mContacts_Names_Array.get(k);
}
mContact_Numbers = new String [mContacts_Numbers_Array.size()];
for (int k = 0; k < mContacts_Numbers_Array.size(); k++) {
mContact_Numbers[k] = mContacts_Numbers_Array.get(k);
}
mContact_Images = new String [mContacts_Images_Array.size()];
for (int k = 0; k < mContacts_Images_Array.size(); k++) {
mContact_Images[k] = mContacts_Images_Array.get(k);
}
mContact_GcmId = new String [mContacts_Gcmid_Array.size()];
for (int k = 0; k < mContacts_Gcmid_Array.size(); k++) {
mContact_GcmId[k] = mContacts_Gcmid_Array.get(k);
}
}
}
else {
}
} catch (JSONException e) {
e.printStackTrace();
}
}
} catch (Exception e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
adapter=new CustomListAdapter(Contacts_Fragment.this, mContact_Names, mContact_Numbers, mContact_Images, mContact_GcmId, Chat_List_Array);
lv.setAdapter(adapter);
/*lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent single_chat = new Intent(getApplicationContext(),Single_Chat.class);
single_chat.putExtra("Mobile_Number", mContact_Numbers[position].toString());
startActivity(single_chat);
// Toast.makeText(getActivity(), mContact_Names[position].toString() +"\n"+mContact_Numbers[position].toString(), Toast.LENGTH_SHORT).show();
}
});*/
}
}
public String getContactName(Context context, String phoneNumber) {
ContentResolver cr = context.getContentResolver();
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
Cursor cursor = cr.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null);
if (cursor == null) {
return null;
}
String contactName = null;
if(cursor.moveToFirst()) {
contactName = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
}
if(cursor != null && !cursor.isClosed()) {
cursor.close();
}
return contactName;
}
private void createContact(String name, String phone) {
ContentValues contact = new ContentValues();
contact.put(People.NAME, name);
Uri insertUri = getContentResolver().insert(People.CONTENT_URI, contact);
Log.d(getClass().getSimpleName(),insertUri.toString());
Uri phoneUri = Uri.withAppendedPath(insertUri, People.Phones.CONTENT_DIRECTORY);
contact.clear();
contact.put(People.Phones.TYPE, People.TYPE_MOBILE);
contact.put(People.NUMBER, phone);
Uri updateUri = getContentResolver().insert(phoneUri, contact);
Toast.makeText(getApplicationContext(), "Created a new contact: " + name + " " + phone, Toast.LENGTH_SHORT).show();
Log.d(getClass().getSimpleName(),updateUri.toString());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main, menu);
/*// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));*/
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Take appropriate action for each action item click
switch (item.getItemId()) {
case R.id.menu_settings:
Intent mInvite = new Intent(getApplicationContext(),Invite_Activity.class);
mInvite.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(mInvite);
overridePendingTransition(R.anim.push_down_in, R.anim.push_down_out);
break;
case R.id.profile_settings:
Intent mProfile_Settings = new Intent(getApplicationContext(),Profile_Settings_Child_Fragment.class);
mProfile_Settings.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(mProfile_Settings);
overridePendingTransition(R.anim.push_down_in, R.anim.push_down_out);
default:
return super.onOptionsItemSelected(item);
}
return true;
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
System.exit(0);
super.onBackPressed();
}
private void Internetchecker() {
// TODO Auto-generated method stub
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
android.net.NetworkInfo wifi = cm
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
android.net.NetworkInfo datac = cm
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if ((wifi != null & datac != null)
&& (wifi.isConnected() | datac.isConnected())) {
//connection is avlilable
//onResume();
mConnection_Note.setEnabled(false);
mConnection_Note.setVisibility(View.GONE);
}else{
//no connection
mConnection_Note.setText("No Internet connection");
mConnection_Note.setVisibility(View.VISIBLE);
Toast.makeText(getApplicationContext(), "no internet connection", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onResume() {
Internetchecker();
super.onResume();
}
}