Android 如何在AsynTask中返回Void函数doInBackground?

Android 如何在AsynTask中返回Void函数doInBackground?,android,android-asynctask,return,Android,Android Asynctask,Return,如何在asyntask中得到函数void的结果 我试过这样做,但应用程序总是停止 我想在webview中使用asyntask实现一个progressbar,在等待过程中 注:我已经读过了 将doInBackground()返回类型更改为String/int public class asynCaller extends AsyncTask<Void, Void, String> { ProgressDialog progressDialog = new

如何在asyntask中得到函数void的结果 我试过这样做,但应用程序总是停止

我想在webview中使用asyntask实现一个progressbar,在等待过程中

注:我已经读过了


doInBackground()
返回类型更改为
String/int

   public class asynCaller extends AsyncTask<Void, Void, String> {
            ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
    //            progressDialog.setMessage("Loading...");
    //            progressDialog.show();
                message("persiapan");
            }

            @Override
            protected String doInBackground(String... params) {
                statusConnection();
                if (checkConnection()) {
                    dataUrl = dataUrl.isEmpty() ? "google" : dataUrl;
                    loadWebview("https://" + dataUrl + ".com");
                    message("Data link is " + dataUrl);
                }
                return "Your Message";
            }

            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
    //            progressDialog.dismiss();
    Log.d("Reached_postExe",result);
                message("result");
            }
        }
公共类asynCaller扩展了AsyncTask{
ProgressDialog=新建ProgressDialog(MainActivity.this);
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//progressDialog.setMessage(“加载…”);
//progressDialog.show();
信息(“波斯潘”);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
statusConnection();
if(检查连接()){
dataUrl=dataUrl.isEmpty()?“google”:dataUrl;
loadWebview(“https://“+dataUrl+”.com”);
消息(“数据链接为”+数据URL);
}
返回“您的信息”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
//progressDialog.disclose();
Log.d(“到达后执行”,结果);
信息(“结果”);
}
}

以下是我将使用的代码,它是从您自己的代码重构而来的。我已对您的消息进行了更改,以使其在控制台中更有意义

   public class AsynCaller extends AsyncTask<Void, Void, String> {
    ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        System.out.println("AsynCaller.onPreExecute called");
        // progressDialog.setMessage("Loading...");
        // progressDialog.show();
        message("AsynCaller.onPreExecute called");
    }

    @Override
    protected String doInBackground(Void... params) {
        System.out.println("AsynCaller.doInBackground called");
        statusConnection();
        final String result; // making it final forces it's definition whichever logic flow the code takes, which is good practice for a returned value 
        if (checkConnection()) {
            dataUrl = dataUrl.isEmpty() ? "google" : dataUrl;
            final String fullUrl = "https://" + dataUrl + ".com";
            loadWebview(fullUrl);
            result = "AsynCaller.doInBackground loadWebView called with " + fullUrl;
        } else {
            result = "AsynCaller.doInBackground checkConnection() is false");
        }
        // message(result); this is unnecessary as the Toast will appear due to the message() call in onPostExecute
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        System.out.println("AsynCaller.onPostExecute called");
        // progressDialog.dismiss();
        message(result);
    }
}
公共类AsynCaller扩展了AsyncTask{
ProgressDialog=新建ProgressDialog(MainActivity.this);
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
System.out.println(“调用AsynCaller.onPreExecute”);
//progressDialog.setMessage(“加载…”);
//progressDialog.show();
消息(“AsynCaller.onPreExecute已调用”);
}
@凌驾
受保护字符串doInBackground(无效…参数){
System.out.println(“调用AsynCaller.doInBackground”);
statusConnection();
final String result;//使其成为final将强制它的定义(无论代码采用哪种逻辑流),这是返回值的良好实践
if(检查连接()){
dataUrl=dataUrl.isEmpty()?“google”:dataUrl;
最后一个字符串fullUrl=“https://”+dataUrl+“.com”;
loadWebview(fullUrl);
result=“AsynCaller.doInBackground loadWebView调用时使用”+fullUrl;
}否则{
结果=“AsynCaller.doInBackground checkConnection()为false”);
}
//消息(结果);这是不必要的,因为由于onPostExecute中的message()调用,Toast将出现
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
System.out.println(“调用AsynCaller.onPostExecute”);
//progressDialog.disclose();
消息(结果);
}
}
如果我是你,我会用Log.d()替换System.out调用,这样控制台输出只在可调试模式下完成,而不是在应用程序的任何发布版本中完成。这里是这方面的参考


最后一个建议是,我不会让ProgressDialog成为AsyncTask的属性,而是在MainActivity中调用方法,就像您在message()中所做的那样。例如,在本例中,可能存在内存泄漏等问题。如果某个对象有效地持有对某个活动上下文的引用,并且该活动在该对象继续存在时被销毁,与正在运行的AsyncTask一样。

将asy task的第三个参数设置为string。您无法从后台线程更新UI。doInBackground无法返回string
   public class asynCaller extends AsyncTask<Void, Void, String> {
            ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
    //            progressDialog.setMessage("Loading...");
    //            progressDialog.show();
                message("persiapan");
            }

            @Override
            protected String doInBackground(String... params) {
                statusConnection();
                if (checkConnection()) {
                    dataUrl = dataUrl.isEmpty() ? "google" : dataUrl;
                    loadWebview("https://" + dataUrl + ".com");
                    message("Data link is " + dataUrl);
                }
                return "Your Message";
            }

            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
    //            progressDialog.dismiss();
    Log.d("Reached_postExe",result);
                message("result");
            }
        }
   public class AsynCaller extends AsyncTask<Void, Void, String> {
    ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        System.out.println("AsynCaller.onPreExecute called");
        // progressDialog.setMessage("Loading...");
        // progressDialog.show();
        message("AsynCaller.onPreExecute called");
    }

    @Override
    protected String doInBackground(Void... params) {
        System.out.println("AsynCaller.doInBackground called");
        statusConnection();
        final String result; // making it final forces it's definition whichever logic flow the code takes, which is good practice for a returned value 
        if (checkConnection()) {
            dataUrl = dataUrl.isEmpty() ? "google" : dataUrl;
            final String fullUrl = "https://" + dataUrl + ".com";
            loadWebview(fullUrl);
            result = "AsynCaller.doInBackground loadWebView called with " + fullUrl;
        } else {
            result = "AsynCaller.doInBackground checkConnection() is false");
        }
        // message(result); this is unnecessary as the Toast will appear due to the message() call in onPostExecute
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        System.out.println("AsynCaller.onPostExecute called");
        // progressDialog.dismiss();
        message(result);
    }
}