2

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

  • 用户打开应用程序并显示条目。
  • 用户单击按钮创建新条目并打开新活动。
  • 用户完成创建条目并单击“完成”。
  • 活动以 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" />
4

5 回答 5

2

AsyncTask是一个用于后台处理的类,请不要试图用它来对你的 UI 或活动做一些事情,它总是会导致不良和不可预测的行为。

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

AsyncTask可能很容易活得比你的Activity,所以当你试图访问 UI 时,它已经消失了。再次销毁并重新创建,你所拥有的只是一个死指针,它给你一个例外。加载您的文件AsyncTask,做网络,访问数据库。只是不要尝试访问 UI/Activity,否则您的应用程序最终会崩溃并烧毁。

于 2013-03-21T12:09:32.637 回答
1
  1. When you click on the Button to create new Entry, launch New Activity. but keep the Activity with entries. do not call finish() after intent.
  2. After creation, and on clicking DONE, just close the Current Activity.(call finish())
  3. mEntryListFragment.updateContent write this method in onStart() of the activity displaying entries.
于 2013-03-21T12:27:13.230 回答
0

使用ProgressDialog来实现这一点。启动对话框 onPreExecute() 并完成它 onPostExecute() 方法。您必须在异步任务中覆盖这些方法。

于 2013-03-21T12:09:15.447 回答
0

只是一个想法。

  1. 你确定你正在检索正确的上下文。
  2. 布尔值设置是否正确?

另外,我相信您正在使用 HttpCore。据我所知,由于它的粒度(与默认情况下可用的 HttpConnection 类相比),它需要更多注意网络和断开/连接。因此,我不认为将它与 AsyncTask 类一起使用是最好的,因为它们与 UI 线程几乎没有联系。因此,不要给用户太多控制权,并且可能会超出应用程序的生命周期。

于 2013-03-21T12:58:25.580 回答
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();
}
于 2013-03-21T12:13:01.257 回答