Активность Android слишком занята, чтобы установить текст TextView? - PullRequest
1 голос
/ 13 июня 2011

У меня есть функция, которая заполняет мою базу данных SQLite записями http-запроса:

try {
        stringEntity = new StringEntity(SQL);
        httpPost.setEntity(stringEntity);
        httpResponse = httpClient.execute(httpPost);
        httpEntity = httpResponse.getEntity();
        bos = new ByteArrayOutputStream();
        httpEntity.writeTo(bos);

        data = bos.toString();

        reader = new BufferedReader(
                  new StringReader(data));

        try {
            //SAVE DATA IN MY DB || WORKS
        } catch(IOException e) {
          e.printStackTrace();
        }

    } catch (IOException e3) {
        // TODO Auto-generated catch block
        e3.printStackTrace();
    }

То, что я пытаюсь сделать, это установить текст textview для моей деятельности перед началом процедуры (перед первым "try {.." в моем коде, который я постет). но текст не изменится, потому что моя деятельность слишком занята, чтобы получить данные (я думаю. У меня нет другого объяснения ..)

есть предложения?

спасибо, * prexx 1008 *

UPDATE '' Получить данные из AsyncTask ''

 txtAction.setText("Loading...");

    AsyncTask<String, String, String> test = new cAsyncTask();

    try {
        data = test.execute(URL).get();

        reader = new BufferedReader(
                  new StringReader(data));

        while ((line = reader.readLine()) != null) {
            //SAVE DATA IN DB || WORKS
            }
        }

    } catch(IOException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Моя асинхронная задача:

class cAsyncTask extends AsyncTask<String, String, String> {

protected String doInBackground(String... urls) {
    int count = urls.length;
    String data = "";
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost;
    StringEntity stringEntity;
    HttpResponse httpResponse;
    HttpEntity httpEntity;
    ByteArrayOutputStream bos;
    String line;
    BufferedReader reader;
    for (int i = 0; i < count; i++) {
        httpPost = new HttpPost(urls[i].toString());
        try {
            stringEntity = new StringEntity(SQL);
            httpPost.setEntity(stringEntity);
            httpResponse = httpClient.execute(httpPost);
            httpEntity = httpResponse.getEntity();
            bos = new ByteArrayOutputStream();
            httpEntity.writeTo(bos);

            data = bos.toString();

        } catch (IOException e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        }
    }
    return data;
}

protected void onProgressUpdate(String... progress) {

}

protected void onPostExecute(String result) {
    String test = result;
}

Ответы [ 3 ]

4 голосов
/ 13 июня 2011

Поместите занятую часть вашего кода в отдельный поток.

Посмотрите на утилиту AsyncTask

Вызовите AsyncTask.execute() сразу после textview.setText("foo") и выбыть в порядке:)

С уважением

ОБНОВЛЕНИЕ с примером кода:

 txtAction.setText("Loading...");
 AsyncTask<String, String, String> test = new cAsyncTask();
 test.execute("http://...");

class cAsyncTask extends AsyncTask<String, String, String> {

protected String doInBackground(String... urls) {
    int count = urls.length;
    String data = "";
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost;
    StringEntity stringEntity;
    HttpResponse httpResponse;
    HttpEntity httpEntity;
    ByteArrayOutputStream bos;
    String line;
    BufferedReader reader;
    for (int i = 0; i < count; i++) {
        httpPost = new HttpPost(urls[i].toString());
        try {
            stringEntity = new StringEntity(SQL);
            httpPost.setEntity(stringEntity);
            httpResponse = httpClient.execute(httpPost);
            httpEntity = httpResponse.getEntity();
            bos = new ByteArrayOutputStream();
            httpEntity.writeTo(bos);

            data = bos.toString();

        } catch (IOException e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        }
    }
     reader = new BufferedReader(
                  new StringReader(data));
       String line = "";
        while ((line = reader.readLine()) != null) {
            //SAVE DATA IN DB || WORKS
     }
    return data;
}


protected void onPostExecute(String result) {
    String test = result;
   textView.setText("Done!");
}

}

Ключ заключается в том, чтобы поместить весь код занятости в метод doInBackGround, который будет выполняться вотдельная тема.Все модификации пользовательского интерфейса должны быть в одном потоке пользовательского интерфейса, и это можно сделать в методе onPostExecute, который будет выполняться в том же потоке пользовательского интерфейса

.
0 голосов
/ 13 июня 2011

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

Кстати.в сотовой сети в потоке пользовательского интерфейса вызовет исключение и убьет ваше приложение.

0 голосов
/ 13 июня 2011

Вы можете попытаться вызвать invalidate () в TextView. Но использование асинхронных задач - это лучший метод для методов с большой загрузкой данных. Это не будет прерывать пользователя в управлении пользовательским интерфейсом.

...