我正在尝试找出创建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,那么为什么在执行任务后实例变量place被设置为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();
}
}
问题内容: 在Android应用程序中,我想从方法返回JSONObject 。 这是代码: 我尝试了此代码,但出现错误。是否可以从方法返回JSONObject ? 问题答案: 编辑: 这可以帮助您, 很明显, 可能您不需要在方法声明中更改返回值和参数。 只需创建以下行 方法将根据您在中提到的参数和返回类型自动创建
问题内容: 如何从AsyncTask中获取数据?我的MainActivity正在调用触发AsyncTask的DataCall.getJSON函数,但是我不确定如何将数据返回到原始Activity。 调用DataCall的MainActivity应该返回一个字符串并将其保存在 数据通话: 问题答案: 对我来说,关键是创建一个名为URLWithParams的类或其他类,因为AsyncTask将只允许发
我有两个类。我的主要activity和扩展的一个,现在在我的主要activity中,我需要从中的获得结果。我怎样才能通过或得到结果到我的主要activity? 下面是示例代码。 我的主要activity。 这是AsyncTask类
问题内容: 一个简单的问题:是否可以返回in的值? 然后在我的: 编辑:这是很久以前我不熟悉Java的地方问的,现在我对它有了更好的了解,我将做一个简短的总结: 异步任务的要点是该任务为,这意味着调用该任务后,该任务将在其自己的线程上开始运行。从asynctask返回一个值将毫无意义,因为原始的调用线程已经进行了其他工作(因此该任务是异步的)。 考虑时间:在某个时间点,你启动了一个将与主线程并行运
问题内容: 我想使用AsyncTask从服务器获取Ftp文件夹列表,并将文件夹名称ArrayList返回到主类并更新微调适配器。 在主班我有带适配器的微调器 在AsyncTask中: 那么我应该如何用主类中的ArrayList替换AsyncTask中的arraylist并动态更新Spinner Updater? 问题答案: 您已经将ArrayList 设为 static ,也将其设为public。
问题内容: 由于某种原因,我完成后没有被调用。 我的班级干事: 我的onPostExecute(): 一切正常,我成功完成并返回一个布尔值,但随后就结束了。 谢谢 问题答案: 您是否在UI线程上创建了AsyncTask?还要在onPostExecute()方法上添加一个@Override注释,以确保正确声明了它。