我使用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中看到响应的主体。 如何正确地将这些数据传回我的活动?
答案 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
谢谢,