3

我在我的应用程序中使用 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

4 回答 4

3

异步任务有 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);

     }

}
于 2013-03-08T06:11:17.433 回答
2

结果从 传递doInBag()到 的onPostexecute()方法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 中,创建一个像这样的构造函数:

public YourAsyncTask(final Context context, final Handler handler) {
this.context = context;
mHandler = handler;
}

说明

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

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

于 2013-03-08T06:09:16.203 回答
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);
于 2013-03-08T06:11:14.973 回答
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

谢谢,

于 2013-03-08T06:20:35.243 回答