0

チェックボックスがクリックされると、私のアプリは asynctask を実行します。メッセージを複数回記録することはできません。最初のクリックでは実行されますが、再度は実行されません。他の質問を見回した後、カスタム クラスを作成し、もちろん new MyAysncTask を呼び出す必要があると判断しましたが (これは既に行っていました)、まだ機能していません。

チェックボックスがクリックされたときに実行されるコードを次に示します。

cbJoining.setOnClickListener(new OnClickListener()
{
    public void onClick(View v)
    {
        new MyAsyncTask(EventID, cbJoining.isChecked(), URL_Race, sDates, sState ).execute();
    }
});

カスタムクラスはこちら

class MyAsyncTask extends AsyncTask<Void, Void, Void>{  

    public String EventID;
    public boolean bJoin;
    public String URL_Race;
    public String sDates;
    public String sState;

    public MyAsyncTask( String myEventID, boolean mybJoin, String myURL_Race, String mysDates, String mysState){
        super();
        EventID = myEventID;
        bJoin = mybJoin;
        URL_Race = myURL_Race;
        sDates = mysDates;
        sState = mysState;
    }

    protected void onPreExecute() { 
    };

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

        //Looper.prepare();

        API oAPI = new API();
        oAPI.Join(mPrefs, EventID, bJoin, URL_Race, sDates, sState);

        Log.d("ASYNCTASK", URL_Race);

        //Looper.loop();

        return null;
    }

    protected void onPostExecute(Void result) {
        Log.d("ASYNCTASK", "Finished");
    };
}

例外は次のとおりです: 07-16 12:45:10.286: E/AndroidRuntime(28309): FATAL EXCEPTION: AsyncTask #2

07-16 12:45:10.286: E/AndroidRuntime(28309): java.lang.RuntimeException: doInBackground() の実行中にエラーが発生しました

07-16 12:45:10.286: E/AndroidRuntime(28309): android.os.AsyncTask$3.done(AsyncTask.java:299)

07-16 12:45:10.286: E/AndroidRuntime (28309): java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:352) で

07-16 12:45:10.286: E/AndroidRuntime (28309): java.util.concurrent.FutureTask.setException (FutureTask.java:219) で

07-16 12:45:10.286: E/AndroidRuntime (28309): java.util.concurrent.FutureTask.run (FutureTask.java:239) で

07-16 12:45:10.286: E/AndroidRuntime(28309): android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)

07-16 12:45:10.286: E/AndroidRuntime (28309): java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1080) で

07-16 12:45:10.286: E/AndroidRuntime(28309): java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) で

07-16 12:45:10.286: E/AndroidRuntime(28309): java.lang.Thread.run(Thread.java:856) で

07-16 12:45:10.286: E/AndroidRuntime(28309): 原因: java.lang.RuntimeException: Looper.prepare() を呼び出していないスレッド内でハンドラを作成できません

07-16 12:45:10.286: E/AndroidRuntime(28309): android.os.Handler で。(Handler.java:197)

07-16 12:45:10.286: E/AndroidRuntime(28309): android.os.Handler で。(Handler.java:111)

07-16 12:45:10.286: E/AndroidRuntime(28309): android.app.Activity で。(Activity.java:759)

07-16 12:45:10.286: E/AndroidRuntime(28309): com.chartermatrixllc.motocrossmatrix.API$FB で。(API.java:88)

07-16 12:45:10.286: E/AndroidRuntime (28309): com.chartermatrixllc.motocrossmatrix.API.Join (API.java:125) で

07-16 12:45:10.286: E/AndroidRuntime(28309): com.chartermatrixllc.motocrossmatrix.Race$MyAsyncTask.doInBackground(Race.java:207) で

07-16 12:45:10.286: E/AndroidRuntime(28309): com.chartermatrixllc.motocrossmatrix.Race$MyAsyncTask.doInBackground(Race.java:1) で

07-16 12:45:10.286: E/AndroidRuntime(28309): android.os.AsyncTask$2.call(AsyncTask.java:287)

07-16 12:45:10.286: E/AndroidRuntime (28309): java.util.concurrent.FutureTask.run で (FutureTask.java:234)

07-16 12:45:10.286: E/AndroidRuntime(28309): ... 4 つ以上

4

3 に答える 3

0

これを試して、

runOnUiThread(new Runnable() {
            @Override
            public void run() {
        new MyAsyncTask(EventID, cbJoining.isChecked(), URL_Race, sDates, sState ).execute();
            }
        });

その他の AsyncTask 関連の疑問については、 https: //stackoverflow.com/a/36078608/2249287 を参照してください。

于 2016-03-18T07:58:16.690 に答える
0

Aは、複数の理由でLooperワーカー スレッドにアタッチされません。主な 2 つは次のとおりです。AsyncTask

  1. Looper.loop()呼び出されると、ワーカー スレッドは受信メッセージの処理と待機で占有されます。つまり、他のタスクを実行できないようにスレッドをブロックします。AsyncTask.execute()これは常に悪いことですが、API レベル 11 以降では、タスクを順番に処理し、連続するタスクがブロッキング タスクの終了を待つようになるため、アプリケーションのパフォーマンスが低下します。
  2. のみLooper.prepare()が呼び出された場合でも、ワーカー スレッドはメッセージ キューに関連付けられます。これは 1 回しか実行できないため、2 回目にタスクが実行されてLooper.prepare()再度呼び出されると、 aRuntimeExceptionがスローされます。したがって、 はAsyncTask1 回しか実行できません。

Looperコード例からは、ワーカー スレッドで が必要な理由が明確ではありませんが、必要な場合は を使用せずAsyncTask、代わりに を使用する必要がありますHandlerThread。はHandlerThread、 を持つバックグラウンド スレッドLooperです。欠点は、UI スレッドとバックグラウンド スレッドの間で渡されるメッセージを自分で処理する必要があることです。

于 2013-07-16T14:10:06.277 に答える