我是android的新手,我希望显示从android中的一个活动转到其他活动的进度,这里是code.Exception是“Activity com.example.mytest.ReadContactsActivity已泄露窗口com.android.internal.policy .impl.PhoneWindow $ DecorView {40ce4900 VE .... R ..... I.0,0-295,62}最初添加在这里“
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 :(得分:3)
doInBackground没有在UI线程中运行,但是你试图从doInBackground获取视图
textViewDisplay = (TextView) findViewById(R.id.textViewDisplay); //wrong
删除它并将其放在PreExecute方法
上你可以在非UI线程上进行UI操作,所以不要在doinBackGround中对textViewDisplay进行任何操作。
最后将数据附加到字符串并在doInBackground中返回,您将在onPostExecute中获取该值作为参数用于设置Textvalue 像这样的东西
public String doInBackGround()
{
--
return result;
}
public void onPostExecute(String result)
{
textViewDisplay.setText(result);
}
答案 1 :(得分:1)
我没有看到您的代码有任何问题,但progressdialog可能为null或等等。
我写过节目&amp;隐藏功能并使用它们。我在激活asynctask之前调用showLoading()函数(在activity中 - 实际上它们在我的baseactivity中)和onPostExecute中的hideLoading()。
请试一试。希望它有所帮助。
问候。
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;
}
}
答案 2 :(得分:1)
这里有一些错误。我不能肯定地说是什么导致了泄漏,但在你追逐它之前,解决这些问题:
你真的不应该在后台线程中弄乱textViewDisplay
。如果您需要/想要在其工作时更新您的用户界面,请使用publishProgress()
来执行此操作。
我现在没有看到你在任何地方打电话给publishProgress()
。这意味着您的onProgressUpdate()
方法可能永远不会被调用。