java – 没有在AsyncTask的onPostExecute中设置Activity的实例变量,或者如何将数据从AsyncTask返回到主UI线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 没有在AsyncTask的onPostExecute中设置Activity的实例变量,或者如何将数据从AsyncTask返回到主UI线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2763字,纯文字阅读大概需要4分钟。
内容图文
我正在尝试找出创建AsyncTask的正确方法,以便从Internet检索某些数据,然后获取该数据并将其捆绑在Intent中并将其传递给新活动(列表显示).所以在第一个活动中我只有一个EditText和Button.在OnClick的情况下,应该调用任务,当它完成时,数据应该捆绑在Intent中并传递给下一个Activity.问题是当我从onPostExecute获取结果并将它们设置为main活动的实例变量时,该任务完成时该实例变量仍为null.这是代码的准系统版本:
public class SearchActivity extends Activity implements OnClickListener
{
static final String TAG = "SearchActivity";
private EditText searchInput;
private Button searchBtn;
private PlacesList places;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_activity);
searchBtn = (Button) findViewById(R.id.button_search);
searchInput = (EditText) findViewById(R.id.search_input);
searchBtn.setOnClickListener(this);
}
public void onClick(View v) {
if(v == searchBtn)
{
String input = searchInput.getText().toString();
if(input != null && input.length() != 0)
{
try {
new TestTask().execute(input);
Bundle bundle = new Bundle();
bundle.putParcelable("places", places);
Intent i = new Intent(this, SearchResultsActivity.class);
i.putExtras(bundle);
startActivity(i);
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
}
private class TestTask extends AsyncTask<String, Void, PlacesList>
{
private ProgressDialog dlg = new ProgressDialog(SearchActivity.this);
@Override
protected void onPreExecute()
{
dlg.setMessage("test");
dlg.show();
}
@Override
protected PlacesList doInBackground(String...args)
{
try
{
return new PlaceLocator().retrieveResults(args[0]);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return new PlacesList();
}
@Override
protected void onPostExecute(PlacesList results)
{
SearchActivity.this.places = results;
if(dlg.isShowing())
dlg.dismiss();
}
}
}
当我调试应用程序时,我看到onPostExecute确实包含一个充满结果的有效PlacesList,那么为什么在执行任务后实例变量的位置设置为null?我正在从AsyncTask错误地“返回数据”?
解决方法:
根据定义,AsyncTask是在不同的线程中执行的.因此,在调用execute之后,您不能指望结果立即可用.相反,您应该触发完成AsyncTask的新意图:
public void onClick(View v) {
if(v == searchBtn)
{
String input = searchInput.getText().toString();
if(input != null && input.length() != 0)
{
try {
new TestTask().execute(input);
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
}
private void startSearch(PlaceList places) {
Bundle bundle = new Bundle();
bundle.putParcelable("places", places);
Intent i = new Intent(this, SearchResultsActivity.class);
i.putExtras(bundle);
startActivity(i);
}
private class TestTask extends AsyncTask<String, Void, PlacesList>
{
...
@Override
protected void onPostExecute(PlacesList results)
{
startSearch(results);
if(dlg.isShowing())
dlg.dismiss();
}
}
内容总结
以上是互联网集市为您收集整理的java – 没有在AsyncTask的onPostExecute中设置Activity的实例变量,或者如何将数据从AsyncTask返回到主UI线程全部内容,希望文章能够帮你解决java – 没有在AsyncTask的onPostExecute中设置Activity的实例变量,或者如何将数据从AsyncTask返回到主UI线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。