gpt4 book ai didi

java - 无法停止 AsyncTask 中的 ProgressDialog

转载 作者:行者123 更新时间:2023-11-30 04:05:20 25 4
gpt4 key购买 nike

我有两个不工作的 AsyncTask。我做错的事情一定有共同点。

我的第一个 Activity 需要很长时间才能加载,所以我希望有一个 progressDialog/Bar 但它失败了。我在 onCreate 中使用 AsyncTask 访问

new HeavyWorker(this).execute();


public class HeavyWorker extends AsyncTask < String , Context , Void > {

private ProgressDialog progressDialog ;
private Context targetCtx ;

public HeavyWorker ( Context context ) {
this.targetCtx = context ;
// this.needToShow = true;
progressDialog = new ProgressDialog ( targetCtx ) ;
progressDialog.setCancelable ( false ) ;
progressDialog.setMessage ( "Retrieving data..." ) ;
progressDialog.setTitle ( "Please wait" ) ;
progressDialog.setIndeterminate ( true ) ;
}

@ Override
protected void onPreExecute ( ) {
progressDialog.show ( ) ;
}

@ Override
protected Void doInBackground ( String ... params ) {
// Do Your WORK here

下面这些行在正常情况下工作正常
“public void onCreate(Bundle savedInstanceState)”区域

        Ls = new LoadSettings(CreateAppointment.this);
gs = new GlobalSubs();

TimeZoneList();

此行动态填充一个 Spinner 框并使其停止工作,因此我将其注释掉。

    //      createTimezone();
ZoneList(Ls.getCountryZone());

这一行还动态地填充了一个微调框,所以我把它注释掉了

    //  createZone();
InitialiseUI();
CreateFileName();

return null ;
}

从未到达过这个区域?

    @ Override
protected void onPostExecute ( Void result ) {
if(progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss ( ) ;
}
}
}

我的第二个页面因同样的问题而失败。
我还在设置页面中尝试过使用略有不同的代码。现在已修复:

//
private class MyClass extends AsyncTask<Void, Void, Void>{

ProgressDialog mProgressDialog;

public MyClass(){

mProgressDialog = new ProgressDialog(Preferences.this);
mProgressDialog.setMessage ("Please Wait While Saving");
mProgressDialog.setTitle("Saving");

//

@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.show(Preferences.this, "Saving", "Please Wait a Sec");
}

@Override
protected Void doInBackground(Void... params)
{
saveSettings();
return null;
}

@Override
protected void onPostExecute(Void unused) {

唯一可行的方法是当我注释掉该行并更改为不同的 Activity 时

//   mProgressDialog.dismiss();
Toast.makeText(Preferences.this, "Your Settings Where Saved.", Toast.LENGTH_SHORT).show();
gotoMainPage();
}

}

private void gotoMainPage(){
Intent a = new Intent(this, Main_entry.class);
finish();
startActivity(a);
}

最佳答案

您不应该在后台对 UI 执行任何操作。 doInBackground() 在后台线程上运行。如果您需要在后台进程中更新 UI,您可以使用 publishProgress()(和 onProgressUpdate())。

在我看来,您仍在尝试在此处执行 UI 操作:

    //  createZone();
InitialiseUI();
CreateFileName();

我不知道 InitialiseUI() 做了什么,但听起来很像 UI。如果您需要 UI 设置,请在 preExecute() 中执行此操作,它在 UI 线程上调用。

您能否在您的 doInBackground() 方法中设置一个断点,看看它进行到什么程度,然后让我们知道?这会有所帮助。

在你的第二个例子中,你说它在 onPostExecute() 这里失败了:

mProgressDialog.dismiss();

实际上只有一种方法会失败。如果 mProgressDialog 为空。你能检查一下这个类的构造函数,并确保你记得实例化它吗?

附言您的第一个 AsyncTask 子类中有第二个通用参数作为 Context。但是,你似乎没有使用它。通常,这将是 doInBackground() 通过 publishProgress() 传递给 onProgressUpdate() 的数据类型。

关于java - 无法停止 AsyncTask 中的 ProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11769714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com