如何在Android中获取Async任务的结果

时间:2014-04-10 13:28:04

标签: android android-asynctask

我正在尝试AsyncTask。我无法理解如何返回结果。我也对doInBackground() return类型Void感到困惑。为什么需要return null;如果我return null我将如何从这种方法中获得价值。

package com.example.shikkok_services;

import android.app.Dialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MyTask extends AsyncTask<Void, Integer, Void> {

    //progressBar holo UI te kaj kore tai Context dorkar tai MyTask e construtor decler korlam.Inner class hole eita dorkar silo na

    Context context;
    Handler handler;
    Dialog dialog;
    TextView txtprogrss;
    ProgressBar progress;
    Button btnCancel;

    MyTask(Context context, Handler handler){
        this.context=context;
        this.handler=handler;

    }

    MyTask(Context context){
      this.context=context;
      this.handler=handler;
    }

    //--------------------------------onPreExecute()............................................
    @Override
    protected void onPreExecute() {

        super.onPreExecute();
        // create dialog

        dialog=new Dialog(context);
        dialog.setCancelable(true);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.pogressdialog);
        dialog.show();

        txtprogrss=(TextView) dialog.findViewById(R.id.txtProgress);
        progress=(ProgressBar)dialog.findViewById(R.id.progressBar2);
        btnCancel=(Button)dialog.findViewById(R.id.btnProgress);
        //progress=new ProgressBar(context);

        btnCancel.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

                MyTask.this.cancel(true);
                dialog.dismiss();
            }
        });
        dialog.show();

    }

    //--------------------------------doInBackground()...........................

    @Override
    protected Void doInBackground(Void... arg0) {
     //Kaj hobe backgournd e not UI e
        // do tasks and update msg
        for (int i = 0; i < 10; i++) {
            if(isCancelled()){
            break;
            }else{
            Log.e("In Background","current value;"+ i);
            publishProgress(i);
            //joto bar publishProgress() call hobe toto bar OnProgressUpdate hobe..
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            }

        }

        return null;    
    }

    //------------------------------onProgressUpdate().....................................

    @Override
    protected void onProgressUpdate(Integer... values) {
        //dowonload hole koto percent hosse seita dhore dhore UI te dekhalte parbo

        super.onProgressUpdate(values);
        // update dialog progress

        progress.setProgress(values[0]);
        txtprogrss.setText("progress update"+ values[0]+"%");

    }

    //-----------------------------OonPostExecute()...........................................
    @Override
    protected void onPostExecute(Void result) {
        // jokhon kaj ses hoe jabe tokhon ei method e asben then UI te chole asben
        super.onPostExecute(result);

        // handler.sent message

        dialog.dismiss();
        Toast.makeText(context, "Finished", Toast.LENGTH_LONG).show();

    }





}

3 个答案:

答案 0 :(得分:4)

  

我也混淆了doInBackground是返回类型Void。为什么需要返回null;如果我返回null如何从这个方法获取值。请告诉我。

这是因为这就是你所做的。您可以return一种类型,只需更改前面的类定义。

public class MyTask extends AsyncTask<Void, Integer, String> {  // changed last param

有了这个,doInBackground()return String类型改为onPostExecute()。这意味着您还必须将该方法更改为

 @Override
protected void onPostExecute(String result) {

然后,您显然会将return中的doInBackground()语句更改为return someString

我使用String作为示例,但您可以更改它。

至于AsyncTask结束后的返回值

See this answer about using an interface。它非常容易实现,并会在任务完成时更新Activity

Also please read (or re-read) the AsyncTask docs

答案 1 :(得分:1)

AsyncTask必须返回null,因为您这样声明:AsyncTask<Void, Integer, Void>。第三个参数确定doInBackground()返回的内容,以及onPostExecute()得到的内容。

更改此数据类型以使其返回到您想要的位置,这样您就可以在onPostExecute()方法中将其作为参数接收,甚至可以在主UI线程中更新View从这个方法中(你甚至可以从doInBackground()以外的任何地方更新它们。)

答案 2 :(得分:-2)

为了从异步任务调用获取值,请执行以下操作:

String result= new MyTask ().execute().get();


class MyTask extends AsyncTask<String, String, String>
        {
        protected String doInBackground(String... params)


                  return somevalue; 
                      }

                }