1

문제점이 2 개 있습니다.
1. 진행률 표시 줄 (회 전자)이 전혀 표시되지 않습니다. 마치 결코 거기에 없었던 것처럼 그것.
2. 내 연락처 목록을 검색하여 arraylist에로드하는 더 좋은 방법이 있습니까? 연락처 이름과 전화 번호 만 입력하면됩니다. 연락처에 둘 이상의 전화 번호가 있으면 둘 다 나타나야합니다. 약 300 개의 연락처에 대해 3.5 초가 걸립니다. 너무 천천히. 그러나 사용자는 기다리는 동안 진행률 표시 줄을보고 작업을 알 수 있도록해야합니다.Android ProgressBar가 표시되지 않고 기본 연락처 조회가 느림

다음은 내 주요 활동 -

public class myActivity extends Activity { 

//declaring references for layout components - buttons, checkboxes, etc 
ProgressBar pbLoadingSpinner; 

ArrayList<Map<String, String>> nativeContactList = new ArrayList<Map<String, String>>(); 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //initializing references to layout components 

    pbLoadingSpinner = (ProgressBar) findViewById(R.id.mySpinner); 

    pbLoadingSpinner.setVisibility(View.VISIBLE); 

    // 
    // 
    // 

    populateContactList(); 
    pbLoadingSpinner.setVisibility(View.GONE); 
} 


private void populateContactList(){ 

    long tStart = System.currentTimeMillis(); 
    int contactCount = 0; 

    Uri allContactsQueryUri = ContactsContract.Contacts.CONTENT_URI; 
    String[] allContactsProjection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.Contacts.HAS_PHONE_NUMBER}; 
    String allContactsSelection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1"; 

    CursorLoader allContactsLoader = new CursorLoader(getApplicationContext(), allContactsQueryUri, allContactsProjection, allContactsSelection, null, null); 
    Cursor allContacts = (Cursor) allContactsLoader.loadInBackground(); 

    nativeContactList.clear(); 

    while(allContacts.moveToNext()){ 

     String contactName = allContacts.getString(allContacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     String contactId = allContacts.getString(allContacts.getColumnIndex(ContactsContract.Contacts._ID)); 
     String hasPhoneNums = allContacts.getString(allContacts.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 

     if(Integer.parseInt(hasPhoneNums)>0){ 

      Uri perContactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
      String[] perContactProjection = new String[] { 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
        ContactsContract.CommonDataKinds.Phone.NUMBER}; 
      String perContactSelection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID+" = "+contactId; 

      //Cursor allPhoneNums = getApplicationContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+" = "+contactId,null,null); 

      CursorLoader perContactCursorLoader = new CursorLoader(getApplicationContext(),perContactUri,perContactProjection,perContactSelection,null,null); 
      Cursor perContactCursor = (Cursor) perContactCursorLoader.loadInBackground(); 

      while(perContactCursor.moveToNext()){ 
       String contactPhoneNumber = perContactCursor.getString(perContactCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

       Map<String,String> namePhone = new HashMap<String, String>(); 
       namePhone.put("Name", contactName); 
       namePhone.put("Phone",contactPhoneNumber); 
       nativeContactList.add(namePhone); 
      } 
      perContactCursor.close(); 
      contactCount++; 
     } 
    } 

    Log.v("VERBOSE_PHONE_TAG", "Contact count =" + contactCount); 

    allContacts.close(); 

    double elapsedSeconds = (System.currentTimeMillis() - tStart)/ 1000.0; 

    Log.v("VERBOSE_PHONE_TAG", "Elapsed Time =" + elapsedSeconds); 
}  
} 

내 XML 레이아웃의 모습 - 당신이 onCreate()에서 populateContactList(); 전화

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:id="@+id/fragment_simple_call" 
android:orientation="vertical"> 

<ProgressBar 
    android:id="@+id/mySpinner" 
    style="?android:attr/progressBarStyleLarge" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" /> 

</LinearLayout> 

답변

1

, 당신은 UI 스레드에서 전체 데이터베이스 쿼리를하고있다, UI가 업데이트되지 않도록 (ProgressBar 회전 포함).

있습니다 (AsyncTask를의 doInBackground() 방법을 호출하여) 백그라운드 스레드에 populateContactList()를 실행 한 다음 진행 표시 줄을 숨기고 onPostExecute()의 결과로 화면을 업데이트하기 AsyncTask 사용하는 것이 좋습니다.

+0

답장을 보내 주셔서 감사합니다. 방금 해봤 어. onPostExecute()에서 본질적으로 진행률 표시 줄을 숨긴 다음 doInBackground()에 arraylist 채우기를 포함하는 간단한 어댑터를 만들고 자동 완성 텍스트보기에 어댑터를 연결합니다. 이제 "Looper.prepare()"를 호출하지 않은 스레드 내부에서 처리기를 만들 수 없습니다. – user3777422

+0

UI 스레드에서 새로운 MyAsyncTask(). execute()를 호출하지 않는 것처럼 들리 겠지만 이론 상으로는 현재 populateContactList()가있는 곳에서 호출해야합니다. – ianhanniballake

+0

나는 이미 그 일을하고있다. 추가 조사를 통해, CursorLoader를 사용하여 라인에 핀을 지적하여 AsyncTask 내부에서 CursorLoader를 사용할 수 없다고 생각하게했다. 그래? – user3777422