[英]Need app to wait until a process is finished then continue
我在这里已经读过很多关于此问题的文章,但是我似乎无法让我的代码等待它找到联系人姓名后再继续并加载我的下一个活动。 如果短信很短,则工作正常,但短信特别长时,则崩溃。 请任何帮助。
这是下面建议的新代码,问题仍然相同
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以获取您的联系人姓名。 然后在AsyncTask的onPostExecute()
方法中调用startActivity()
,该方法在主UI线程上运行。 因此,从本质上讲,您启动了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
使用这样的东西:
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文档以获取有关该类的更多详细说明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.