完成活动后如何使用对话框运行AsyncTask?

时间:2013-03-21 12:04:43

标签: android

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

  • 用户打开应用程序并显示条目。
  • 用户点击按钮创建新条目,然后打开新活动。
  • 用户完成创建条目并点击“完成”。
  • 活动以setResult()和finish()结束。

我要添加的是在查看活动完全加载后运行的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" />

5 个答案:

答案 0 :(得分:1)

AsyncTask是一个用于后台处理的课程,请不要尝试使用它来处理您的UI或活动,始终会导致糟糕且不可预测的行为。

也许我应该详细说明一下。活动来去匆匆,被杀死,恢复,摧毁和重建,作为他们生活的一种方式。这绝对正常。

您的AsyncTask可能会轻易超过您的Activity,所以当您尝试访问用户界面时,它已经消失了。再次被摧毁并重新创建,而你所拥有的只是一个死指针,它会给你一个例外。将文件加载到AsyncTask,进行联网,访问数据库。只是不要尝试访问UI /活动,否则您的应用程序最终会崩溃和烧毁。

答案 1 :(得分:1)

  1. 单击按钮创建新条目时,启动“新建活动”。但保持活动的条目。不要在意图后调用finish()。
  2. 创建后,单击DONE,只需关闭当前活动。(调用完成())
  3. mEntryListFragment.updateContent在显示条目的活动的onStart()中写入此方法。

答案 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)

只是一个想法。

  1. 您确定要检索正确的上下文吗?
  2. 布尔设置是否正确?
  3. 另外,我相信你正在使用HttpCore。根据我的记忆,由于它的粒度(与默认情况下可用的HttpConnection类相比),它需要更多关注网络和dis /连接。因此,我不认为最好将它与AsyncTask类一起使用,因为它们与UI线程的连接很少。因此,不要对用户给予太多控制,并且可能超出应用程序的使用寿命。