2013-04-12 4 views
0

У меня есть цикл внутри mt AsyncTask doInBackground метод.Использование вектора внутри AsyncTask

@Override 
     protected Void doInBackground(Void... params) { 

      receive = new Vector<Sms>(); 
      sent = new Vector<Sms>(); 
      draft = new Vector<Sms>(); 

      try { 

       String type, from, date, budy; 
       Vector<Sms> receive = new Vector<Sms>(); 
       Vector<Sms> sent = new Vector<Sms>(); 
       Vector<Sms> draft = new Vector<Sms>(); 

       progress_status = 1; 
       publishProgress(progress_status); 

       Cursor cursor = mContext.getContentResolver().query(
         Uri.parse("content://sms"), null, null, null, null);; 
       cursor.moveToFirst(); 
       progress_status = 2; 
       publishProgress(progress_status); 


       do { 
        type = cursor.getString(cursor.getColumnIndexOrThrow("type")); 
        from = cursor 
          .getString(cursor.getColumnIndexOrThrow("address")); 
        date = cursor.getString(cursor.getColumnIndexOrThrow("date")); 
        budy = cursor.getString(cursor.getColumnIndexOrThrow("body")); 

        // check type (1-inbox,2-outbox,3-draft) and set there views 
        int numType = Integer.parseInt(type); 

        switch (numType) { 
        case 1: 
         Log.d("inbox", "message"); 
         Log.d("inbox", numType + ""); 
         //receive.add(new Sms(type, from, date, budy)); 
         break; 
        case 2: 
         Log.d("outbox", "message"); 
         Log.d("outbox", numType + ""); 
         sent.add(new Sms(type, from, date, budy)); 
         break; 
        case 3: 
         Log.d("draft", "message"); 
         Log.d("draft", numType + ""); 
         //draft.add(new Sms(type, from, date, budy)); 
         break; 

        default: 
         break; 
        } 

       } while (cursor.moveToNext()); 

      } catch (Exception e) { 
       Log.d("eeeee", e.getMessage()); 
      } 







      return null; 
     } 

Этот переключатель находится внутри цикла, если я удаляю векторное действие (при приеме и отправке), он будет работать идеально.

но я хочу обновить вектор, но я поймаю исключение, когда я это сделаю.

«Невозможно создать обработчик внутри потока, который не под названием Looper.prepare()»

так в этом коде я разместил, как вы можете я положил получить в комментариях и посланный вектор активен так цикл будет работать до тех пор, первый послал получите в петлю, так что журнал кот будет выглядеть:

04-13 00:40:41.000: D/inbox(13953): message 
04-13 00:40:41.000: D/inbox(13953): 1 
04-13 00:40:41.000: D/inbox(13953): message 
04-13 00:40:41.000: D/inbox(13953): 1 
04-13 00:40:41.005: D/outbox(13953): message 
04-13 00:40:41.005: D/outbox(13953): 2 
04-13 00:40:41.005: D/eeeee(13953): Can't create handler inside thread that has not called Looper.prepare() 

, как я сказал, одна петля обыкновение Couse truble только vector.add ...

это e.printStackTrace();

04-13 01:01:08.080: W/System.err(14901): java.lang.RuntimeException: Can't create  handler inside thread that has not called Looper.prepare() 
04-13 01:01:08.085: W/System.err(14901): at android.os.Handler.<init>(Handler.java:121) 
04-13 01:01:08.085: W/System.err(14901): at android.app.Activity.<init>(Activity.java:739) 
04-13 01:01:08.085: W/System.err(14901): at com.example.sms.Sms.<init>(Sms.java:18) 
04-13 01:01:08.085: W/System.err(14901): at com.example.sms.MainActivity$ShowDialogAsyncTask.doInBackground(MainActivity.java:168) 
04-13 01:01:08.085: W/System.err(14901): at com.example.sms.MainActivity$ShowDialogAsyncTask.doInBackground(MainActivity.java:1) 
04-13 01:01:08.085: W/System.err(14901): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
04-13 01:01:08.085: W/System.err(14901): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
04-13 01:01:08.085: W/System.err(14901): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
04-13 01:01:08.085: W/System.err(14901): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
04-13 01:01:08.085: W/System.err(14901): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
04-13 01:01:08.085: W/System.err(14901): at java.lang.Thread.run(Thread.java:856) 
+0

Ваш код является неполным, что делает его практически невозможно, чтобы помочь вам ... Вы печатать, чтобы отобразить Тост в вашем AsyncTask? – Sam

+0

Конечным результатом здесь является то, что вы не можете создать обработчик в любом потоке (AysncTask работает в своем потоке), кроме основного потока. Я считаю, что SMS - это ваш собственный класс? В этом я считаю, что вы создаете нового обработчика. – AedonEtLIRA

+0

Я добавил еще код. я не использую обработчик и честен, я не знаю, как это сделать, даже если бы я хотел. –

ответ

0

Нельзя расширять деятельность, если вы не используете ее как «Экран». Вы удалили SMS extends Activity и вместо этого сконструировали SMS более централизованно. Действия используются для отображения агрегированных данных, а не сохранения.

Сделать SMS что-то вроде этого:

public class SMS { 

    public String type, from, mdate, body; 

    public SMS(String type, String from, String mdate, String body) { 
     this.type = type; 
     this.from = from; 
     this.mdate = mdate; 
     this.body = body; 
    } 
} 
+0

у вас есть идея, почему, когда цикл завершил векторный сброс? i проверю размер, как данные добавлены, и он добавил строки. но сразу после того, как цикл превысил размер 0 снова –

+0

проблема решена. Спасибо вам всем . –