mt AsyncTask doInBackground メソッド内にループがあります。
@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()
私が言ったように、ループだけでは 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)