如何展示android的进步
我是android新手,我想在android中从一个活动移动到另一个活动时显示进度。下面是代码。例外是“activity com.example.mytest.ReadContactsActivity泄漏了window com.android.internal.policy.impl.PhoneWindow$DecorView{40ce4900 V.E..R..i.0,0-295,62},最初添加到这里”如何展示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
类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;
}
}
这里有几件事不对。我不能确定是什么导致了泄漏,但在您追查之前,请解决以下问题:
- 你真的不应该在后台线程中处理
。如果您需要/想要在UI工作时更新UI,请使用textViewDisplay
进行更新publishProgress()
- 我现在根本看不到您调用的
。这意味着您的publishProgress()
方法可能永远不会被调用onProgressUpdate()
- 你真的不应该在后台线程中处理
。如果您需要/想要在UI工作时更新UI,请使用textViewDisplay
进行更新publishProgress()
- 我现在根本看不到您调用的
。这意味着您的publishProgress()
方法可能永远不会被调用onProgressUpdate()
- 这里有几件事不对。我不能确定是什么导致了泄漏,但在您追查之前,请解决以下问题:
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新手,您应该开始阅读这本书