2012-10-31 20 views
2

我已閱讀關於此問題的許多帖子,但我似乎無法讓我的代碼等待,直到它找到聯繫人名稱,然後繼續並加載我的下一個活動。如果它是一個短的短信,它的工作正常,但如果它是一個特別長的短信它崩潰。請任何幫助。需要應用程序,直到一個過程完成,然後繼續

這是因爲以下建議問題的新代碼還是一樣

 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); 
    } 
} 
+0

這可能有助於指定你在寫什麼語言.. – Alex

+0

他正在一個Android應用程序,亞歷克斯 –

回答

0

一個解決辦法是啓動的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

+0

謝謝你的提示我曾嘗試使用活動中的代碼我從上面的sms接收器開始,但它似乎沒有等到查找聯繫人姓名 – user1744343

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); 
    } 
} 

檢查的AsyncTask的文檔類的更詳細的解釋在http://developer.android.com/reference/android/os/AsyncTask.html

+0

您好,感謝您的建議,我嘗試了上述代碼,但代碼似乎沒有等到繼續執行活動B.把找到的用戶名代碼放在後臺的do中,如果短消息找到了名字,但是如果這個短消息很長,那麼這個名字會回到未知的狀態,我猜測這意味着find名字在繼續之前沒有完成活動B.我只是不明白爲什麼。 – user1744343

相關問題