android - 完成 Activity 后如何通过对话框运行 AsyncTask?

标签 android

我有两项 Activity ,一项用于显示条目,另一项用于创建条目。这是一个标准用例:

  • 用户打开应用并显示条目。
  • 用户单击按钮创建新条目并打开新 Activity 。
  • 用户完成条目创建并点击“完成”。
  • Activity 通过 setResult() 和 finish() 结束。

我想要添加的是一个在查看 Activity 完全加载后运行的 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();
        }
    }
}

它在返回主 Activity 之前运行 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" />

最佳答案

AsyncTask 是一个用于后台处理的类,请不要尝试使用它来对您的 UI 或 Activity 执行某些操作,它总是会导致不好的结果不可预测的行为。

也许我应该详细说明一下。 Activity 来来去去,被杀掉又被恢复,被摧毁又被重建,就像他们生活的惯常方式一样。这绝对是正常的。

您的 AsyncTask 可能会轻易地超过您的 Activity,因此当您尝试访问 UI 时,它已经消失了。销毁并再次重新创建,你得到的只是一个死指针,这给了你一个异常(exception)。在 AsyncTask 中加载文件,进行网络连接,访问数据库。只是不要尝试访问 UI/Activities,否则您的应用程序最终会崩溃并烧毁。

关于android - 完成 Activity 后如何通过对话框运行 AsyncTask?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15547036/

相关文章:

Android Studio NDK/SDK 版本错误

java - 无法调用 Product.class 的无参数构造函数

android - Android 的 MVP 模式(DI - 接口(interface))

android - 状态栏图标应该与启动器图标不同

java - Android JUnit4 Instrumentation Tests 上没有可运行的方法

android - 如何在每次单击 WebView 中的链接时显示 ProgressDialog

android - 如何将应用程序限制为仅适用于 Android 手机

android - 如何在 Android XML 可绘制文件中定义圆形?

Android Studio 2.3 无法使用即时运行 : debug apk crash with ClassNotFoundException

android - 如何检查联系人是否存在于数据库android中