如何提取异步任务的返回值?

时间:2013-03-08 06:06:18

标签: android android-asynctask

我使用http GET方法在我的应用数据检索中。 任务完成后,我希望在mainActivity中显示返回值(我的应用程序中只有1个活动)

这是我的asyncTask类:

class getAsync extends AsyncTask<String,Void,String> {
    String ret;
    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        myGetReq myget = new myGetReq();
        ret = myget.get(url);
        Log.d("[RETURN STATUS]",ret);
        return ret;
    }
}

从我的主要活动中,我以下列方式使用它:

getAsync get = new getAsync();
get.execute(url);
statText.setText(get.ret);

其中statText是我的活动窗口中的文本。 它保持空白,甚至很难我在logcat中看到响应的主体。 如何正确地将这些数据传回我的活动?

4 个答案:

答案 0 :(得分:3)

Asynctask有onPostExecute方法...在这个方法中你可以使用UI组件我在onPostExecute中有settext吗...使用下面的代码..

class getAsync extends AsyncTask<String,Void,String> {

    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        myGetReq myget = new myGetReq();
        String ret = myget.get(url);
        Log.d("[RETURN STATUS]",ret);
        return ret;
    }

   @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            statText.setText(result);

     }

}

答案 1 :(得分:2)

结果从doInBag()的{​​{1}}传递到onPostexecute()

现在您可以使用处理程序将数据发送回您的活动,如下所示:

AsyncTask

编辑:使用AsyncTask处理程序:

在您的活动中声明一个处理程序,如下所示:

@Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        if (mProgressDialog != null) {
            if (mProgressDialog.isShowing()) {
                mProgressDialog.dismiss();
            }
        }
        final Message message = new Message();
        if (result != null && !result.equals("")) {
            if (result.equals("success")) {
                message.what = 1000; // to show SUCCESS
            } else {
                message.what = 1001; // to show FAILURE
            }
        } else {
                message.what = 1001; // to show FAILURE
        }
        mHandler.sendMessage(message);
    }

现在,在您的活动中,像这样调用AsyncTask:

    /**
         * Handler to update the UI.
         */
        private static final Handler sHandler = new Handler() {

    @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1000) {

                        } else {
                         // failure
                       } 
                     }
    };

现在在AsyncTask中,创建一个这样的构造函数:

YourAsyncTask obj = new YourAsyncTask(context, sHandler);
obj.execute();

<强>解释

为什么你应该在这里使用处理程序,因为你可能希望在完成后台操作后回到你的活动,根据AsyncTask结果做其他任务。在这里,您将Handler的引用传递给asyncTask,并最终将结果发送回您的活动。

请注意,上面的处理程序是静态处理程序,否则如果您的活动在完成异步操作之前完成,则可能会发生内存泄漏。

答案 2 :(得分:0)

public String ret="";定义为您的活动类。

按以下方式设置:

class getAsync extends AsyncTask<String,Void,String> {

    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        myGetReq myget = new myGetReq();
        ret = myget.get(url);
        Log.d("[RETURN STATUS]",ret);
        return ret;
    }
}

并通过以下方式获取简单:

statText.setText(ret);

答案 3 :(得分:0)

创建一个回调接口以将结果发布到您的活动是一个很好的做法。

public interface AsyncTaskCompleteListener {
    public void onTaskComplete(String result);
}

在单独的课程中进行网络操作

public class RssFeedAsyncTask extends
        AsyncTask<String, Void, String> {
    private ProgressDialog Dialog;
    String response = "";
    Activity _context;
    private AsyncTaskCompletionListener callback;

    public RssFeedAsyncTask(Activity _context) {
        this._context = _context;
        this.callback = (AsyncTaskCompletionListener) _context;
    }

    @Override
    protected void onPreExecute() {
        Dialog = new ProgressDialog(_context);
        Dialog.setMessage("Loading...");
        Dialog.show();

    }

    @Override
    protected String doInBackground(String... urls) {
        try {
            // Your Code
        } catch (Exception e) {
        }
        return null;

    }

    @Override
    protected void onPostExecute(String result) {
        Dialog.dismiss();
        callback.onTaskComplete(result);

    }

}

最后你的活动类和实现回调接口

public class RssReaderActivity extends Activity implements AsyncTaskCompletionListener{



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

        if(Utility.determineConnectivity(this))
        new RssFeedAsyncTask(this).execute(Yoururl);
        else
            Toast.makeText(this, "No Internet Connection", Toast.LENGTH_SHORT).show();
    }



    @Override
    public void onTaskComplete(String result) {
    //write the code to upadte the UI from the Result
          statText.setText(result);
    }

}

希望这能帮助您编写结构清晰,清晰的单独编程。 有关详细信息,请查看以下博客

http://amitandroid.blogspot.in/2013/02/android-rssfeed-with-async-task-example.html

谢谢,