2013-03-07 2 views
0

Я новичок в андроиде, и я хочу отображать прогресс при переходе от одной активности к другой деятельности в андроиде здесь, это код. Исключение: «Активность com.example.mytest.ReadContactsActivity имеет просочившийся оконный com .android.internal.policy.impl.PhoneWindow $ DecorView {40ce4900 VE .... R ..... I. 0,0-295,62}, который первоначально был добавлен здесь»Как показать прогресс в android

class MyTask extends AsyncTask<Void, Integer, Void> { 

Dialog dialog; 
ProgressBar progressBar; 
TextView tvLoading,tvPer; 


@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    dialog = new Dialog(ReadContactsActivity.this); 
    dialog.setCancelable(false); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.progressdialog); 

    progressBar = (ProgressBar) dialog.findViewById(R.id.progressBar1); 
    tvLoading = (TextView) dialog.findViewById(R.id.tv1); 
    dialog.show(); 
} 

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

textViewDisplay = (TextView) findViewById(R.id.textViewDisplay); 
ContentResolver cr = getContentResolver(); 
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
     null, null, null, null); 

if (cur.getCount() > 0) { 
    while (cur.moveToNext()) { 
     String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
     String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
      System.out.println("name : " + name + ", ID : " + id); 
      textViewDisplay.append("Name: "); 
      textViewDisplay.append(name); 

      // get the phone number 
      Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
            new String[]{id}, null); 
      while (pCur.moveToNext()) { 
        String phone = pCur.getString(
         pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        textViewDisplay.append(",Number: "+ phone); 
        textViewDisplay.append("\n");  
      } 
      pCur.close(); 
      } 
     } 
    } 
return null; 
} 

@Override 
protected void onProgressUpdate(Integer... values) { 
    super.onProgressUpdate(values); 
    progressBar.setProgress(values[0]); 
    tvLoading.setText("Loading... " + values[0] + " %"); 
    tvPer.setText(values[0]+" %"); 
} 

@SuppressWarnings("deprecation") 
@Override 
protected void onPostExecute(Void result) { 
    super.onPostExecute(result); 

    dialog.dismiss(); 

    AlertDialog alert = new AlertDialog.Builder(ReadContactsActivity.this) 
      .create(); 

    alert.setTitle("Completed!!!"); 
    alert.setMessage("Your Task is Completed SuccessFully!!!"); 
    alert.setButton("Dismiss", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 

     } 
    }); 
    alert.show(); 
} 
} 
+0

является его внутренним классом или отдельным класс – Pragnani

+0

это внутренний класс – Supreet

+0

Я отправил ответ, провери его один раз .. – Pragnani

ответ

3

doInBackground не выполняется в потоке пользовательского интерфейса, но вы пытаетесь получить вид из doInBackground

textViewDisplay = (TextView) findViewById(R.id.textViewDisplay); //wrong 

удалить это и поместить его onPreExecute методу

И вы действительно можете сделать работу пользовательского интерфейса на non UI Thread, поэтому не делайте никаких операций над textViewDisplay в doinBackGround.

Наконец Append данных в строку и вернуться в doInBackground, и вы получите это значение в onPostExecute как использование параметра, который для установки Textvalue что-то вроде этого

public String doInBackGround() 
{ 
-- 
return result; 
} 
public void onPostExecute(String result) 
{ 
textViewDisplay.setText(result); 
} 
+0

вы имеете в виду, что я получу все контакты и номер в InBackGround() и просто добавлю их в метод OnPostExecute() – Supreet

+1

. Добавьте их в строку или сохраните их отдельно в списке, который по вашему выбору. но вы не должны выполнять операции пользовательского интерфейса в doInBackground, вы уже знаете, что onPostExecute захватывает результат, возвращаемый doInBackGround, пытается вернуть список или строку, содержащую контакты в doInBackground, и использовать это в onPostExecute для выполнения операций Ui, таких как отображение в TextView – Pragnani

+0

, благодаря большому количеству i понять – Supreet

1

Я надеваю Нет никаких проблем с вашим кодом, но progressdialog может быть нулевым или т. д.

Я написал шоу & скрыть функции и использовать их. Я вызываю функцию showLoading(), прежде чем вызывать asynctask (в действии - фактически они находятся в моей baseactivity) и hideLoading() в onPostExecute.

Попробуйте пожалуйста. Надеюсь, поможет.

С уважением.

protected void showLoading() { 
    if (dialog == null) { 
     dialog = ProgressDialog.show(this, "", this.getResources() 
       .getString(R.string.loading)); 
     dialog.setMessage(this.getResources().getString(R.string.loading)); 
     dialog.setCancelable(true); 
     dialog.setCanceledOnTouchOutside(false); 
     dialog.setOnCancelListener(new OnCancelListener() { 

      public void onCancel(DialogInterface arg0) { 
       if(dialog.isShowing()) 
        dialog.dismiss(); 
       finish(); 
      } 
     }); 
     dialog.show(); 
    } 
} 

protected void hideLoading() { 
    if (dialog != null && dialog.isShowing()) { 
     dialog.dismiss(); 
     dialog = null; 
    } 
} 
1

Здесь пара ошибок. Я не могу сказать наверняка, что вызывает утечку, но, прежде чем гнаться, что вниз, исправить эти проблемы:

  • Вы действительно не должны возиться с textViewDisplay в фоновом потоке. Если вам нужно/хотите обновить свой пользовательский интерфейс во время работы, используйте для этого publishProgress().

  • Я не вижу нигде, что вы звоните publishProgress() совсем прямо сейчас. Это означает, что ваш метод onProgressUpdate(), вероятно, никогда не будет вызван.

+0

как я новичок в android, пожалуйста, измените код, который будет использовать publishProgress() – Supreet

+1

Поскольку вы новичок в Android, вы должны начать читать [ документация.] (http://developer.android.com/reference/android/os/AsyncTask.html) Это важная часть программирования. – Geobits

Смежные вопросы