Runnable is posted successfully but not run

Если вы хотите составить список / массив целых чисел, то самый простой способ сделать это - принять список строк, разделенных запятыми (,), и преобразовать его в список целых чисел. Не забудьте упомянуть [FromUri] attriubte.your url похож на :

...? ID = 71 и accountID = 1,2,3,289,56

public HttpResponseMessage test([FromUri]int ID, [FromUri]string accountID)
{
    List<int> accountIdList = new List<int>();
    string[] arrAccountId = accountId.Split(new char[] { ',' });
    for (var i = 0; i < arrAccountId.Length; i++)
    {
        try
        {
           accountIdList.Add(Int32.Parse(arrAccountId[i]));
        }
        catch (Exception)
        {
        }
    }
}
24
задан mvds 3 November 2010 в 02:25
поделиться

3 ответа

Если вы посмотрите документы для View.post , то найдете некоторую соответствующую информацию:

Этот метод может вызываться извне потока пользовательского интерфейса только в том случае, если это представление прикреплено. к окну.

Поскольку вы делаете это в onCreate, вполне вероятно, что иногда ваш View еще не будет прикреплен к окну. Вы можете проверить это, переопределив onAttachedToWindow и поместив что-то в журналы, а также войдя в систему при публикации. Вы увидите, что когда сообщение не удается, почтовый звонок происходит раньше onAttachedToWindow.

Как уже упоминали другие, вы можете использовать Activity.runOnUiThread или предоставить свой собственный обработчик. Однако, если вы хотите сделать это непосредственно из самого View, вы можете просто получить обработчик View:

view.getHandler().post(...);

Это особенно полезно, если у вас есть пользовательское представление, включающее некоторые вид фоновой загрузки. Есть также дополнительный бонус: нет необходимости создавать новый отдельный обработчик.

56
ответ дан 28 November 2019 в 22:18
поделиться

Думаю, проблема в том, что вы обновляете пользовательский интерфейс (ImageView) с помощью отдельного потока, который не является потоком пользовательского интерфейса. Пользовательский интерфейс может быть обновлен только потоком пользовательского интерфейса.

Вы можете решить эту проблему с помощью обработчика :

Handler uiHandler;

public void onCreate(){
    ...
    uiHandler = new Handler(); // This makes the handler attached to UI Thread
    ...
}

Затем замените:

if ( !img.post(new Runnable() {

на

uiHandler.post(new Runnable() {

, чтобы убедиться, что изображение обновлено в потоке пользовательского интерфейса.

Обработчик - довольно запутанная концепция, я также потратил часы на изучение, чтобы по-настоящему понять это;)

7
ответ дан 28 November 2019 в 22:18
поделиться

Используйте следующий код, можете опубликовать свой код в MainThread в любое время в любом месте, но это не зависит от Context или Activity. Это может предотвратить view.getHandler() неудачу или утомительные onAttachedToWindow() вещи и т. Д.

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            //TODO
        }
    });
3
ответ дан 28 November 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: