我有两个活动,一个用于显示条目,另一个用于创建条目。这是一个标准用例:
我要添加的是在查看活动完全加载后运行的AsyncTask。此AsyncTask在运行时显示一个对话框。问题是,当我将此代码放入onActivityResult()时:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(resultCode) {
case (Activity.RESULT_OK): {
mEntryListFragment.updateContent();
runAsyncTaskHere();
}
}
}
它在返回主活动之前运行AsyncTask,并且没有对话框显示。有什么想法我可以做什么?
编辑:这是AsyncTask。
public static class LogInTask extends AsyncTask<String, Void, Integer> {
protected String username = "";
protected String password = "";
protected ProgressDialog dialog;
protected boolean showDialogs;
public LogInTask(boolean sd) {
this.showDialogs = sd;
}
@Override
protected void onPreExecute() {
if (this.showDialogs) dialog = ProgressDialog.show(MainActivity.getContext(), null, "Logging in...");
}
@Override
protected Integer doInBackground(String... login) {
if (Config.DEBUG) Log.d(Config.APP_NAME, "in doInBackground() of LogInTask");
HttpResponse response = null;
String username = login[0];
String password = login[1];
try {
HttpPost httpPost = new HttpPost(URL_BASE + URL_LOGIN);
// main (JSON) login method
JSONObject json = new JSONObject().put("user",
new JSONObject()
.put("email", username)
.put("password", password)
.put("remember_me", Config.REMEMBER_LOGIN)
);
this.username = username;
this.password = password;
StringEntity se = new StringEntity(json.toString());
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
httpPost.setEntity(se);
response = httpclient.execute(httpPost);
String responseEntity = EntityUtils.toString(response.getEntity());
JSONObject result = new JSONObject(responseEntity);
return result.getBoolean("success") ? 1 : KEY_ERROR; // Return 1 if successful and -1 if not
} catch (UnknownHostException e) {
e.printStackTrace();
KEY_ERROR;
} catch (Exception e) {
e.printStackTrace();
return KEY_ERROR;
}
}
@Override
protected void onPostExecute(Integer result) {
if (this.showDialogs) {
dialog.dismiss();
String text = result == 1 ? "Login was successful." : "Login failed!";
makeToast(text);
}
}
}
编辑2:我试过了:
boolean needToUpdate = false;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(resultCode) {
case (Activity.RESULT_OK): {
mEntryListFragment.updateContent();
needToUpdate = true;
}
}
}
@Override
public void onResume() {
super.onResume();
if (needToUpdate) {
runAsyncTaskHere();
mEntryListFragment.updateContent();
}
needToUpdate = false;
}
它做了同样的事情。
编辑3:这是AndroidManifest的相关部分:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".AddEntryActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:configChanges="orientation" />
答案 0 :(得分:1)
AsyncTask
是一个用于后台处理的课程,请不要尝试使用它来处理您的UI或活动,始终会导致糟糕且不可预测的行为。
也许我应该详细说明一下。活动来去匆匆,被杀死,恢复,摧毁和重建,作为他们生活的一种方式。这绝对正常。
您的AsyncTask
可能会轻易超过您的Activity
,所以当您尝试访问用户界面时,它已经消失了。再次被摧毁并重新创建,而你所拥有的只是一个死指针,它会给你一个例外。将文件加载到AsyncTask
,进行联网,访问数据库。只是不要尝试访问UI /活动,否则您的应用程序最终会崩溃和烧毁。
答案 1 :(得分:1)
答案 2 :(得分:0)
使用ProgressDialog来实现此目的。启动对话框onPreExecute()并在onPostExecute()方法上完成它。你必须在异步任务中覆盖这些方法。
答案 3 :(得分:0)
我认为,你必须使用回调概念,
就像在任何时候一样,加载完成后,在callback
内部实施AsyncTask
,在doInBackGround()
内执行任务后,您可以使用onPostExecute()
。
尝试这样的事情,
Callback_interface
{
void async_run_after_some_time() ;
}
main_activity_class extends Activity Implements Callback_interface
{
void async_run_after_some_time()
{
// implement your toast here
}
}
onPostExecute()
{
main_activity_class ob = new main_activity_class ();
ob.async_run_after_some_time();
}
答案 4 :(得分:0)
只是一个想法。
另外,我相信你正在使用HttpCore。根据我的记忆,由于它的粒度(与默认情况下可用的HttpConnection类相比),它需要更多关注网络和dis /连接。因此,我不认为最好将它与AsyncTask类一起使用,因为它们与UI线程的连接很少。因此,不要对用户给予太多控制,并且可能超出应用程序的使用寿命。