gpt4 book ai didi

java - Activity 的实例变量未在 AsyncTask 的 onPostExecute 中设置或如何将数据从 AsyncTask 返回到主 UI 线程

转载 作者:行者123 更新时间:2023-11-29 04:01:21 25 4
gpt4 key购买 nike

我正在尝试找出创建 AsyncTask 以从 Internet 检索一些数据然后获取该数据并将其 bundle 在 Intent 中并将其传递给新 Activity (列表显示)的正确方法。所以在第一个 Activity 中我只有一个 EditText 和 Button。在 OnClick 的情况下,任务应该被调用,当它完成时,数据应该被 bundle 在一个 Intent 中并传递给下一个 Activity。问题是当我从 onPostExecute 获取结果并将它们设置为主要 Activity 的实例变量时,任务完成时该实例变量仍然为空。这是代码的准系统版本:

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,那么为什么在任务执行后实例变量 places 设置为 null?我要从 AsyncTask 错误地“返回数据”?

最佳答案

根据定义,AsyncTask 在不同的线程中执行。因此,您不能期望在调用执行后立即获得结果。相反,您应该在 AsyncTask 完成后触发新 Intent :

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 - Activity 的实例变量未在 AsyncTask 的 onPostExecute 中设置或如何将数据从 AsyncTask 返回到主 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3356193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com