【问题标题】:Android AsyncTask return value [duplicate]Android AsyncTask返回值[重复]
【发布时间】:2013-05-23 10:48:57
【问题描述】:
final Dialog Alert_Dialog = new Dialog(MainList.this);
Alert_Dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Alert_Dialog.setContentView(R.layout.alert_dialog_progressbar);
((TextView)Alert_Dialog.findViewById(R.id.txtMessage)).setText(R.string.please_wait_);
Alert_Dialog.setCancelable(false);
Alert_Dialog.show();
((Button) Alert_Dialog.findViewById(R.id.btnCancel)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Alert_Dialog.cancel();
   }
});

然后像这样调用 AsynTask :

String res="";
try{
    SendingWebPageTask sendMaster=new SendingWebPageTask();
    res=sendMaster.execute(UrlMaster).get();
}catch (Exception e) {
e.printStackTrace();
}

我正在返回基于响应的 url 响应我的值,我正在调用第二个 url,但问题是当我以这种方式从异步任务返回值时,它不会显示对话框并且它会挂起设备直到 asynTask无法完成它的任务,所以任何人都可以帮助我。

【问题讨论】:

  • 那么还有其他方式来显示进度条并从 AsyncTask 返回值吗?
  • @PankajKumar 什么??没有解决方案我是对的?
  • so anyother way to display progress bar and return value from AsyncTask 先生不是解决方案吗?
  • 现在你已经开始在这里开玩笑了..
  • :没问题。我建议你从对话框中调用 asynctask,(在你取消对话框的同一个地方)然后在 asyntask 的 postexecute 上更新 res 的值......现在这不是一个笑话......跨度>

标签: android android-asynctask


【解决方案1】:

在这里:

res=sendMaster.execute(UrlMaster).get(); //<<<

您在 UI 线程而不是其他线程上调用 AsyncTask.get() 方法,因此这将冻结 UI,直到 doInBackground 执行未完成,然后将结果返回到主 ui 线程。

选项 1#

当 doInBackground 执行完成时,您将需要使用 onPostExecute 来更新 UI,因为 onPostExecute 总是在 UI 线程上调用。要显示ProgressDialog,您可以使用onPreExecute(),它在说明后台任务之前调用

选项 2#

在线程内调用 AsyncTask.get() 以从 doInBackground 获取结果并使用 Activity.runOnUiThread 用于从非 UI 线程更新 UI

【讨论】:

  • 感谢您的回复,但在第一个异步任务的结果中,我正在调用第二个 url,在这种情况下我必须使用 .get 来返回值,如果我不能使用 .get() 然后在第二个 url 中将传递空值
  • @Pankaj :好的,然后在我的回答中查看第二个选项 2
  • 好的,但我不能用 AsyncTask 做到这一点?因为在 Runnable UiThread 中存在 ANR 的通道。
【解决方案2】:

试试这个:

 class SendingWebPageTask extends AsyncTask<String, Void, String>
        {
                private Dialog alertDialog;
                private boolean shouldCallTheSecondURL = false;

                public SendingWebPageTask(boolean shouldCallSecondURL) {
                     this.shouldCallSecondURL = shouldCallSecondURL;
                }
            @Override
            protected void onPreExecute() {
               alertDialog = new Dialog(MainList.this);
    alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    alertDialog.setContentView(R.layout.alert_dialog_progressbar);
    ((TextView)alertDialog.findViewById(R.id.txtMessage)).setText(R.string.please_wait_);
    alertDialog.setCancelable(false);
    alertDialog.show();
    ((Button) alertDialog.findViewById(R.id.btnCancel)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        alertDialog.dismiss();
       }
    });
            }

            @Override
            protected String doInBackground(String... params) {
                //TODO your code in background...
                            return result;//result is in String format
            }

            @Override
            protected void onPostExecute(String result) {
                            //dismiss the alertDialog after the task finish his background work
                            alertDialog.dismiss();
                super.onPostExecute(result);
                Log.d("SendingWebPageTask", "result task : "+result);
                            String secondUrl = result;
                            if(shouldCallSecondURL)
                                new SendingWebPageTask(false).execute(secondUrl); 
            }
        }

第一次打电话给你的AsyncTask:

SendingWebPageTask sendMaster=new SendingWebPageTask(true);//passing true , so the asyncTask will launch another asynctask for the secondURL retreived from onPostExecute()
sendMaster.execute(UrlMaster);

【讨论】:

  • 我也试过这个,但是在调用第一个 url 的基础上,我正在返回值,并且在返回值上我正在调用第二个 url,我必须从异步任务返回值,所以这个解决方案不起作用就我而言
  • 所以,在onPostExecute() 方法中,您可以再次执行AsyncTask,并将您从第一次调用asyncTask 中获得的第二个url 传递给它。查看我的编辑
  • 当我调用 url 时,我会不断向 Web 服务器发送数据,如果存储成功,它会给我回复,然后我以这种方式调用第二个或第三个 url 我如何使用 onPostExecute()?
  • 感谢您,但我有更多数据,简而言之,我正在从我的 sqlite 检索数据并存储在网络服务器上,因此当我存储第一个数据时,它会响应我。在响应的基础上,我正在发送下一个数据
  • 所有这些你都可以在onPostExecute中完成,你可以测试你的结果并检查你是否应该再次执行AsyncTask,下一个数据发送到服务器,或者不
猜你喜欢
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2023-03-10
相关资源
最近更新 更多