从 Activity 调用时,另一个 AsyncTask 类中的 ProgressDialog 未显示

Posted

技术标签:

【中文标题】从 Activity 调用时,另一个 AsyncTask 类中的 ProgressDialog 未显示【英文标题】:ProgressDialog in another AsyncTask class not showing when called from Activity 【发布时间】:2017-06-01 14:09:57 【问题描述】:

我有一个名为 RestClient 的类,它从我的 webService 获取一些信息,然后返回,我试图在它访问 Internet 时运行一个进度对话框。因为我在不止一个地方使用这个类,所以我不会在活动本身中做。这是我的RestClient 课程:

public class RestClient extends AsyncTask<URL, String, String> 

    private Context context;
    private String string;
public RestClient(Context context, String string)

    this.context = context;
    this.string = string;


@Override
protected void onPreExecute() 
    dialog = ProgressDialog.show(context, "Buscando seu Produto","Por favor, espere um momento...",true ,false);
    //I've already tried:
    /*ProgressDialog dialog = new ProgressDialog(context);
    dialog.setTitle("Buscando seu Produto");
    dialog.setMessage("Por favor, espere um momento...");
    dialog.setIndeterminate(true);
    dialog.setCancelable(false);*/

    dialog.show();
    super.onPreExecute();


@Override
protected String doInBackground(URL... params) 
    try 

        //Some WebService gets and Json conversions using my string variable
        //and some Thread.sleep that counts 2000 miliseconds to do all the queries

        dialog.dismiss();

     catch (IOException | InterruptedException |JSONException e) 
        e.printStackTrace();

        dialog.dismiss();

        return e.getMessage();
    
    return null;


@Override
protected void onPostExecute(String s) 
    super.onPostExecute(s);


   

在我的活动中,当我单击这样的按钮时,我调用了 RestClient 类:

--- 编辑:我忘了提到我在同一个活动中有一个 AlertDialog,有时可以在 ProgressDialog 之前和之后显示 ---

private Button buttonConfirm;
     private EditView evString;

     private String theString;
     private String returnFromExecute;

     private RestClient restClient;


     private AlertDialog.Builder dialog;

     @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_access_webservice);

            evString = (EditText) findViewById(R.id.editViewMyString);
            buttonConfirm = (Button) findViewById(R.id.buttonConfirm);

            dialog = new ProgressDialog(IdentificacaoDeProdutoActivity.this);
            dialog.setTitle("Error");
            dialog.setMessage("Please try again");
            dialog.setIndeterminate(true);
            dialog.setCancelable(false);


            buttonConfirmar.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v)                    
                    theString = evString.getText().toString();
                    if(!(theString!=null && theString.trim().length()>0)) //To check if theString is not null
                    
                          dialog.show();
                    

                    restClient = new RestClient(AccessWebserviceActivity.this, theString);

                    //Then I call execute and put a Thread.sleep a bit longer to compensate the ones I have in my doInBackground
                    restClient.execute();
                    try 
                        Thread.sleep(2050);

                     catch (Exception e) 
                        dialog.show();
                        return;
                    
                
            
        

问题是我的ProgressDialog 从不显示。我已经尝试过getParent()getApplication()getApplicationContext() 而不是AccessWebserviceActivity.this,但都没有奏效。有人知道发生了什么,我应该怎么做?

【问题讨论】:

你能告诉我你的 AsyncTask 类是你的 Activity 类的子类还是 AsnctaskClass 有不同的包? @AmeerHamza,它不是我的 Activity 的子项,因为我在其他 Activity 中使用它,但是是的,它与我的 Activity 不在同一个包中。 【参考方案1】:

你还没有创建进度对话框试试这个。

ProgressDialog dialog;

 @Override
    protected void onPreExecute() 
        dialog= new ProgressDialog(context);
        dialog.setMessage("on Progress");
        dialog.show();
        super.onPreExecute();
    

【讨论】:

请不要否定我的问题。不是那么简单。这个进度条无论如何都不会出现。 我没有做错什么兄弟,我很惊讶为什么我的回答对你不起作用。 没关系。我已经尝试了每个博客和每个解决方案所说的一切,但没有奏效。 尝试新的 RestClient(AccessWebserviceActivity.this).execute(theString); 不行,我在构造函数中对这个字符串做了一些改动。【参考方案2】:
returnFromExecute = restClient.get();

删除该声明。您已经:

restClient.execute();

应该可以。

doInBackground() 的结果应该在onPostExecute() 中处理。无法在onCreate() 中处理或检索。

【讨论】:

【参考方案3】:

你需要打电话

dialog = ProgressDialog.show(context, "Buscando seu Produto","Por favor, espere um momento...",true ,false);

并删除

 dialog.show();

也把你的dialog.dismiss(); onPostExecute() 中的方法。这个dialog.dismiss() 方法在catch 块中很好,但是如果你在try 块中调用这个方法,它的目的是什么。只要您调用此AsyncTask,它就会删除进度对话框。

【讨论】:

您是否从 doInBackground 方法的 try 块中删除了 dismiss 方法?如果您遇到任何错误,请粘贴,以便有人可以帮助您。 是的,我有。我只是把它放在那里,因为某处说这可能是问题之一,但没有奏效, 我收到了I/Choreographer: Skipped 126 frames! The application may be doing too much work on its main thread. 你为什么要这样做?线程.sleep(2050); AsyncTask 的 doInBackground 在后台工作,并在 UI 上显示对话框。阅读此developer.android.com/reference/android/os/AsyncTask.html 我有这个 UI Thread.sleep 等待我的后台任务结束。之后我在我的应用程序中使用它的返回,如果我没有这个中断,我会抛出一个空异常。【参考方案4】:

在对线程和进程进行了大量研究后,我发现我必须封装我之后的所有代码 RestClient.execute 在一个

new Thread(new Runnable() public void run() // My code );

这样代码的执行在后台以及 WebService 查询中发生。

编辑:

即使创建一个新线程有效,也不推荐!正确的做法是创建另一个扩展 AsyncTask 的类来完成工作。

【讨论】:

以上是关于从 Activity 调用时,另一个 AsyncTask 类中的 ProgressDialog 未显示的主要内容,如果未能解决你的问题,请参考以下文章

Android 如何从 Main Activity 中的另一个类调用 Activity 数据类型?

从后台线程调用 startActivity 并且主线程被阻塞时,Activity 延迟启动

从另一个方法ActionController :: UnknownFormat调用时,部分渲染不起作用

如何从另一个类(它扩展了 Activity)方法,Android 调用 CCColorLayer 类的方法?

启动另一个全屏 Activity 时未调用 Activity 的 onStop()

区分从主屏幕启动的 Activity 或从 App 启动的另一个 Activity