2

この問題についてここで多くの投稿を読みましたが、続行して次のアクティビティをロードする前に、連絡先名が見つかるまでコードを待機させることができないようです。短い SMS の場合は問題なく動作しますが、特に長い SMS の場合はクラッシュします。助けてください。

これは、問題の下に提案されている新しいコードであり、同じです

     new LoaderAsyncTask().execute();

    }

public class LoaderAsyncTask extends AsyncTask<Void, Void, Void> {
    // Variables to pass data between doInBackground() and onPostExevute() here

    protected Void doInBackground(Void... params) {

         Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
                    Uri.encode(smsSender));
                Cursor cursor = ((Context) contexts).getContentResolver().query(uri,
                    new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID },
                    null, null, null);
                contactId = "";
                name="unknown";
                if (cursor.moveToFirst()) {
                    do {
                    contactId = cursor.getString(cursor.getColumnIndex(PhoneLookup._ID));
                    name = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));

                    } while (cursor.moveToNext());
                }


        return null;
    }

    protected void onPostExecute(Void result) {
         ////////////////////////////////////
        // start a new task before dying

        intents.setClass((Context) contexts, SendSMSActivity.class);
        intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        // pass Serializable object
        intents.putExtra("PhoneNumber", smsSender);
        intents.putExtra("smsBody", smsBody);
        intents.putExtra("SmsMessageId", SmsMessageId);
        intents.putExtra("contactId", contactId);
        intents.putExtra("SenderName", name);
        // start UI
        ((Context) contexts).startActivity(intents);
    }
}   
4

2 に答える 2

0

次のようなものを使用します。

public class ActivityA extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {

        new LoaderAsyncTask().execute();
    }

}

public class LoaderAsyncTask extends AsyncTask<Void, Void, Void> {
    // Variables to pass data between doInBackground() and onPostExevute() here

    @Override
    protected Integer doInBackground(Void... params) {

        // yoyr loader stuff here

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // update UI or call ActivityB here

         ////////////////////////////////////
        // start a new task before dying
        Intent = ... // not shown in your code
        intent.setClass(context, SendSMSActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        // pass Serializable object
        intent.putExtra("PhoneNumber", smsSender);
        intent.putExtra("smsBody", smsBody);
        intent.putExtra("SmsMessageId", SmsMessageId);
        intent.putExtra("contactId", contactId);
        intent.putExtra("SenderName", name);
        // start UI
        context.startActivity(intent);
    }
}

http://developer.android.com/reference/android/os/AsyncTask.htmlのクラスの詳細な説明については、AsyncTask のドキュメントを確認してください。

于 2012-10-31T23:17:19.150 に答える
0

解決策の 1 つは、AsyncTask を開始して連絡先の名前を取得することです。次に、メイン UI スレッドで実行startActivity()される AsyncTask のメソッドを呼び出します。onPostExecute()したがって、本質的には、AsyncTask を開始して、連絡先の名前を非同期で取得し、startActivity()終了したときにのみ呼び出します。

ここに素晴らしいチュートリアルがあります: http://www.vogella.com/articles/AndroidPerformance/article.html

AsyncTask のドキュメント: http://developer.android.com/reference/android/os/AsyncTask.html

このガイドの「AsyncTask の使用」まで下にスクロールします: http://developer.android.com/guide/components/processes-and-threads.html#Threads

于 2012-10-31T20:26:45.713 に答える