如何展示android的进步

如何展示android的进步,android,android-layout,android-intent,Android,Android Layout,Android Intent,我是android新手,我想在android中从一个活动移动到另一个活动时显示进度。下面是代码。例外是“activity com.example.mytest.ReadContactsActivity泄漏了window com.android.internal.policy.impl.PhoneWindow$DecorView{40ce4900 V.E..R..i.0,0-295,62},最初添加到这里” 类MyTask扩展了AsyncTask{ 对话; ProgressBar Progress

我是android新手,我想在android中从一个活动移动到另一个活动时显示进度。下面是代码。例外是“activity com.example.mytest.ReadContactsActivity泄漏了window com.android.internal.policy.impl.PhoneWindow$DecorView{40ce4900 V.E..R..i.0,0-295,62},最初添加到这里”

类MyTask扩展了AsyncTask{
对话;
ProgressBar ProgressBar;
TextView电视加载,tvPer;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
dialog=新建对话框(ReadContactsActivity.this);
对话框。可设置可取消(false);
对话框.requestWindowFeature(窗口.FEATURE\u无\u标题);
setContentView(R.layout.progressdialog);
progressBar=(progressBar)dialog.findViewById(R.id.progressBar1);
tvLoading=(TextView)dialog.findViewById(R.id.tv1);
dialog.show();
}
@凌驾
受保护的Void doInBackground(Void…参数){
textViewDisplay=(TextView)findViewById(R.id.textViewDisplay);
ContentResolver cr=getContentResolver();
Cursor cur=cr.query(Contacts contract.Contacts.CONTENT\u URI,
空,空,空,空);
如果(cur.getCount()>0){
while(cur.moveToNext()){
字符串id=cur.getString(cur.getColumnIndex(ContactsContract.Contacts._id));
字符串名称=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+”,ID:+ID);
textViewDisplay.append(“名称:”);
textViewDisplay.append(名称);
//获取电话号码
游标pCur=cr.query(ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,null,
ContactsContract.CommonDataTypes.Phone.CONTACT_ID+“=?”,
新字符串[]{id},null);
while(pCur.moveToNext()){
String phone=pCur.getString(
pCur.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
textViewDisplay.append(“,号码:+电话”);
textViewDisplay.append(“\n”);
}
pCur.close();
}
}
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(整型…值){
super.onProgressUpdate(值);
progressBar.setProgress(值[0]);
setText(“加载…”+值[0]+“%”);
tvPer.setText(值[0]+“%”);
}
@抑制警告(“弃用”)
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
dialog.dismise();
AlertDialog alert=新建AlertDialog.Builder(ReadContactsActivity.this)
.create();
alert.setTitle(“已完成!!!”;
alert.setMessage(“您的任务已成功完成!!!”;
alert.setButton(“disease”,新建DialogInterface.OnClickListener()){
@凌驾
public void onClick(DialogInterface dialog,int which){
dialog.dismise();
}
});
alert.show();
}
}

我看不出您的代码有任何问题,但progressdialog可能为null或其他

我已经编写了显示和隐藏函数并使用了它们。在执行asynctask(在activity中-实际上它们在我的baseactivity中)和onPostExecute中的hideLoading()之前,我调用showLoading()函数

请试一试。希望能有帮助

问候

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;
    }
} 

我看不到您的代码有任何问题,但progressdialog可能为null或其他

我已经编写了显示和隐藏函数并使用了它们。在执行asynctask(在activity中-实际上它们在我的baseactivity中)和onPostExecute中的hideLoading()之前,我调用showLoading()函数

请试一试。希望能有帮助

问候

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;
    }
} 

这里有几件事不对。我不能确定是什么导致了泄漏,但在您追查之前,请解决以下问题:

  • 你真的不应该在后台线程中处理
    textViewDisplay
    。如果您需要/想要在UI工作时更新UI,请使用
    publishProgress()
    进行更新

  • 我现在根本看不到您调用的
    publishProgress()
    。这意味着您的
    onProgressUpdate()
    方法可能永远不会被调用


    • 这里有几件事不对。我不能确定是什么导致了泄漏,但在您追查之前,请解决以下问题:

      • 你真的不应该在后台线程中处理
        textViewDisplay
        。如果您需要/想要在UI工作时更新UI,请使用
        publishProgress()
        进行更新

      • 我现在根本看不到您调用的
        publishProgress()
        。这意味着您的
        onProgressUpdate()
        方法可能永远不会被调用


      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);
      }
      

      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);
      }
      

      由于我是android新手,请您修改一下如何使用publishProgress()的代码,因为您是android新手,您应该开始阅读这本书