2

2つのアクティビティがあります。1つはエントリを表示するためのもので、もう1つはエントリを作成するためのものです。標準的な使用例は次のとおりです。

  • ユーザーがアプリを開くと、エントリが表示されます。
  • ユーザーがボタンをクリックして新しいエントリを作成すると、新しいアクティビティが開きます。
  • ユーザーはエントリの作成を終了し、[完了]をクリックします。
  • アクティビティは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 /アクティビティにアクセスしようとしないでください。アクセスすると、アプリケーションが最終的にクラッシュして書き込みます。

于 2013-03-21T12:09:32.637 に答える
1
  1. ボタンをクリックして新しいエントリを作成したら、新しいアクティビティを起動します。ただし、アクティビティはエントリとともに保持します。インテントの後でfinish()を呼び出さないでください。
  2. 作成後、[完了]をクリックしたら、現在のアクティビティを閉じます。(finish()を呼び出します)
  3. mEntryListFragment.updateContentは、エントリを表示するアクティビティのonStart()にこのメソッドを記述します。
于 2013-03-21T12:27:13.230 に答える
0

これを実現するには、 ProgressDialogを使用します。ダイアログonPreExecute()を開始し、onPostExecute()メソッドで終了します。非同期タスクでこれらのメソッドをオーバーライドする必要があります。

于 2013-03-21T12:09:15.447 に答える
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 に答える
0

ちょっとした考え。

  1. 適切なコンテキストを取得していますか?
  2. ブール値は正しく設定されていますか?

さらに、HttpCoreを使用していると思います。私が覚えていることから、それは(デフォルトで利用可能なHttpConnectionクラスと比較して)その粒度のために、ネットワーキングと切断/接続に関してもう少し注意を払う必要があります。そのため、AsyncTaskクラスはUIスレッドとほとんど関係がないため、AsyncTaskクラスで使用するのが最善ではないと思います。したがって、ユーザーに多くの制御を与えず、アプリケーションの寿命を超えて存続する可能性があります。

于 2013-03-21T12:58:25.580 に答える