需要应用程序等待直到过程完成,然后继续



我在这里阅读了许多有关此问题的文章,但是我似乎无法等到我的代码等到它继续找到联系人名称并加载我的下一个活动。如果是简短的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);
    }
}   

一种解决方案是启动异步词以获取您的联系人名称。然后在ASYNCTASK的onPostExecute()方法中调用startActivity(),该方法在主UI线程上运行。因此,从本质上讲,您启动了一个异步,让它异步获取联系人名称,然后仅在完成时致电startActivity()

这是一个不错的教程:http://www.vogella.com/articles/androidperformance/article.html

和异步文档:http://developer.android.com/reference/android/os/asynctask.html

在本指南中向下滚动至"使用asynctask":http://developer.android.com/guide/components/processes-and-threads.html#threads

使用类似的东西:

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/Randroid/Android/OS/asynctask.html

最新更新