【问题标题】:How do I show ProgressDialog from AsyncTask which is returning boolean value from doInBackground()?如何从从 doInBackground() 返回布尔值的 AsyncTask 中显示 ProgressDialog?
【发布时间】:2014-11-26 12:28:48
【问题描述】:

我从中调用 AsyncTask 进行登录的活动。 如果返回 true,则切换到另一个活动。

signIn.setOnClickListener(new OnClickListener(){

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Log.d("On Click Sign In", "Before PD shown");
        //          pd.show();

        Log.d("On Click Sign In", "After PD shown");
        try {
            if (new SignIn(SessionLogin.this).execute(email, pass).get())
            {
                Log.d("onClick", "True");
                Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_LONG).show();
                Intent i = new Intent(SessionLogin.this, DashBoardMain.class);
                //              pd.dismiss();
                Log.d("SessionLogin", "true SignIn");
                startActivity(i);
                finish();
            }
            else 
            {
                Toast.makeText(SessionLogin.this, "Sorry! Something went wrong. Please try again.", Toast.LENGTH_LONG).show();
                Intent i = new Intent(SessionLogin.this, Woftos_sign_in_up.class);
                //          pd.dismiss();
                Log.d("SessionLogin", "false || Null SignIn");
                startActivity(i);
                finish();
            }

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

});

我在其中连接到数据库并返回值的 AsyncTask。 在异步任务运行之前,我想显示 ProgressDialog。

public class SignIn extends AsyncTask<String, Void, Boolean> {

    String queryString;

    ProgressDialog PD;
    public static String NodeID=null;
    public static String Gender=null;
    public static String imageName=null;
    String result;
    Context context;

    public SignIn(Context mcontext){
        context=mcontext;
        Log.d("constructor", "context "+context.toString());
        PD=new ProgressDialog(mcontext);
        PD.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        PD.setTitle("Please Wait...");
        PD.setMessage("Signing in...");
        PD.setCancelable(false);
        PD.setIndeterminate(true);
        PD.show();
    }

    protected void onPostExecute(Boolean x) {   
    super.onPostExecute(x);
    if(PD.isShowing()){
        Log.d("onPostExecute", "ProgressDialog b4 dismiss");
        PD.dismiss();
        Log.d("onPostExecute", "ProgressDialog after dismiss");
        }
    }

    @Override
    protected Boolean doInBackground(String... arg0) {

        Log.d("in async", "" + arg0[0] + " " + arg0[1]);


            try {
                //Connecting to database
                DBConnect.connect();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            queryString = "{\"query\":\"START n=node(*) WHERE n.Email_Id='"
                    + arg0[0] + "' AND n.Password='" + arg0[1]
                    + "' RETURN n.Password,id(n),n.Gender,n.Profile_Photo\", \"params\":{}}";

            try {
                //Sending Query
                DBConnect.sendQuery(queryString);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {
                //Getting result of Query
             result = DBConnect.readInputStream();

            JSONObject obj1 = new JSONObject(result);
            JSONArray nameArray = obj1.getJSONArray("data");
            int res=nameArray.length();
            if(res==0)
            {
                return false;
            }
            result = nameArray.getJSONArray(0).getString(0);
            NodeID = nameArray.getJSONArray(0).getString(1);
            Gender = nameArray.getJSONArray(0).getString(2);
            //imageName = nameArray.getJSONArray(0).getString(3);

            Log.d("NodeID-Gender in SignIn", ""+result+" " + NodeID+" "+Gender);
            DashBoardMain.nodeID=NodeID;
            DashBoardMain.DBGender=Gender;
            //DashBoardMain.imageName=imageName;
            return true;
            //DashBoardMain.imageName=imageName;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;

    }
}

无论我做什么,ProgressDialog 都不会出现。其余代码可以正常连接数据库并返回值。 请帮忙..

【问题讨论】:

  • 你看到 Log.d("onPostExecute", "ProgressDialog b4 dismiss"); Log.d("onPostExecute", "关闭后的ProgressDialog");这些日志在 logcat 中?
  • 这意味着您的进度对话框正在显示可能是 doInBackground 太快了您看不到 progressDialog,请您尝试在后台添加延迟 1-2 秒并检查它是否显示进度对话框
  • 与您的问题无关,我建议您在使用 AsyncTask 时使用 onPreExecute ,它会根据标准对您有所帮助,而且效果很好,因为其他所有人都在他们的答案中指定了这一点
  • 获取Log.d的结果("NodeID-Gender in SignIn", ""+result+" " + NodeID+" "+Gender);在 logcat 上,大约需要 1-2 分钟,但没有出现进度条。
  • 我尝试将它放入 onPreExecute() 但 ProgressDialog 仍然没有出现。

标签: android android-asynctask progressdialog


【解决方案1】:

在异步任务中尝试这样,

@Override
    protected void onPreExecute() {
       PD=new ProgressDialog(mcontext);
    PD.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    PD.setTitle("Please Wait...");
    PD.setMessage("Signing in...");
    PD.setCancelable(false);
    PD.setIndeterminate(true);
    PD.show();
        super.onPreExecute();
    }

 @Override
    protected void onPostExecute(String[] result) {
        PD.dismiss();
        super.onPostExecute(result);
    }

【讨论】:

    【解决方案2】:
    Override the OnPreExecute() of AsyncTask and paste
    
    context=mcontext;
    Log.d("constructor", "context "+context.toString());
    PD=new ProgressDialog(mcontext);
    PD.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    PD.setTitle("Please Wait...");
    PD.setMessage("Signing in...");
    PD.setCancelable(false);
    PD.setIndeterminate(true);
    PD.show();
    

    【讨论】:

    • 我觉得导航代码在打开对话框后立即关闭它。尝试在 PostExecute() 上使用 startActivity()。
    【解决方案3】:

    在 onPreExecute() 方法中显示您的 ProgressDialog,并在 AsyncTask 的 onPostExecute() 方法中将其关闭。就像这样。

    protected void onPreExecute() {
    
    
     PD=new ProgressDialog(mcontext);
        PD.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        PD.setTitle("Please Wait...");
        PD.setMessage("Signing in...");
        PD.setCancelable(false);
        PD.setIndeterminate(true);
        PD.show();
    
    };
    

    protected void onPostExecute(Boolean x) {   
    super.onPostExecute(x);
    if(PD.isShowing()){
        Log.d("onPostExecute", "ProgressDialog b4 dismiss");
        PD.dismiss();
        Log.d("onPostExecute", "ProgressDialog after dismiss");
        }
    }
    

    【讨论】:

      【解决方案4】:

      尝试像这样使用pre excecute

      public SignIn(Context mcontext){
          context=mcontext;
          Log.d("constructor", "context "+context.toString());
      }
      
      protected void onPreExecute() {
          super.onPreExecute();
          PD=new ProgressDialog(context);
          PD.setTitle("Please Wait...");
          PD.setMessage("Signing in...");
          PD.setCancelable(false);
          PD.setIndeterminate(true);
          PD.show();
              }
      

      或者---------------这可能是因为你的进程突然完成所以progressdialog可能会突然关闭。为了避免在你的@987654324中发生这种情况@尝试:

      protected void onPostExecute(Boolean x) {   
      super.onPostExecute(x);
      if(PD.isShowing()){
          Log.d("onPostExecute", "ProgressDialog b4 dismiss");
          Handler handler = new Handler();
          handler.postDelayed(new Runnable() {
          public void run() {
               PD.dismiss();
          }}, 3000);
      
          Log.d("onPostExecute", "ProgressDialog after dismiss");
          }
      } 
      

      或者------------------------

      从您的 aynctask 调用中删除 .get()get() 在必要时等待计算完成,然后检索其结果。这意味着,您正在阻塞您的 UI 线程,等待结果。

      解决方案:不要调用 get

      通常,你会在 postExecute 中调用一个函数(回调)。

      【讨论】:

      • 试过了,还是一样。
      • 试过了,还是没有进度对话框。
      • 我给了你另一个答案或部分答案,试试看。
      • 嘿,ProgressDialog 出现了,但是在执行 doInBackground() 之后,在 onPostExecute() 中。我想要 doInBackground() 运行时的进度对话框。
      • 我认为你做的后台进程非常小,它在很短的时间内完成,进度对话框将从 PD.show();本身。
      猜你喜欢
      • 2013-05-21
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多