نشاط Android مشغول جدًا بحيث لا يمكنه تعيين نص TextView؟

StackOverflow https://stackoverflow.com/questions/6332255

سؤال

لدي وظيفة تملأ قاعدة بيانات 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();
    }

ما أحاول القيام به هو تعيين نص عرض نصي على نشاطي قبل بدء الإجراء (أمام أول "محاولة{.." في الكود الخاص بي الذي أضعه).لكن النص لن يتغير، لأن نشاطي مشغول جدًا بحيث لا يتمكن من الحصول على البيانات (أعتقد أنه ليس لدي أي تفسير آخر..)

أي اقتراحات؟

شكرا ، prexx

تحديث''الحصول على البيانات من 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;
}
هل كانت مفيدة؟

المحلول

ضع الجزء المزدحم من الكود الخاص بك في موضوع منفصل.

انظر الى 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 الطريقة التي سيتم تنفيذها في نفس مؤشر ترابط واجهة المستخدم

نصائح أخرى

يمكنك محاولة استدعاء إبطال () في TextView.لكن استخدام المهام غير المتزامنة هو أفضل ممارسة لطرق تحميل البيانات الثقيلة.لن يؤدي ذلك إلى مقاطعة المستخدم أثناء تشغيل عناصر تحكم واجهة المستخدم.

لا علاقة له بـ "مشغول جدًا" ولكن بحقيقة أن النص سيتم تعيينه فقط عند عودة الطريقة.ومع شبكة العلاقات الخاصة بك سوف يتأخر هذا.

راجع للشغل.على شبكة Honeycomb في مؤشر ترابط واجهة المستخدم ، سيؤدي ذلك إلى استثناء وقتل تطبيقك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top