0

私は数週間だけアンドロイドを使っています。AsyncTask を使用しようとしています。問題は、私の onPostExecute が呼び出されず、AsyncTask が終了しないように見えることです。

私はログファイルでこれを取得しています:

04-04 11:47:42.722: D/BbHelper(10343): AsyncClic PreExecute ! 
04-04 11:47:42.742: D/BbHelper(10343): AsyncClic
04-04 11:47:43.774: D/BbHelper(10343): Waiting... clic=RUNNING 
04-04 11:47:44.838: D/BbHelper(10343): Waiting... clic=RUNNING 
04-04 11:47:45.869: D/BbHelper(10343): Waiting... clic=RUNNING 
04-04 11:47:46.919: D/BbHelper(10343): Waiting... clic=RUNNING 
04-04 11:47:47.977: D/BbHelper(10343): Waiting... clic=RUNNING 
04-04 11:47:48.999: D/BbHelper(10343): Waiting... clic=RUNNING 
04-04 11:47:50.001: D/BbHelper(10343): Waiting... clic=RUNNING 
04-04 11:47:51.005: D/BbHelper(10343): Waiting... clic=RUNNING 
... 

不明確に。したがって、getStatus は常に RUNNING を返します。

したがって、AsyncTask は起動されますが、決して終了しません。

私のコードで何が間違っていますか?

前もって感謝します。アンドレ

public class MainActivity extends Activity {
    private AsyncClic clic;
    clic=new AsyncClic();

    @Override
    protected void onCreate(Bundle savedInstanceState) { 
        layout = (LinearLayout) LinearLayout.inflate(this, R.layout.activity_main, null);
    setContentView(layout);
        bActiver = (Button) layout.findViewById(R.id.bActiver);
        bActiver.setOnClickListener(new bActiverListener());
    }
    private class AsyncClic extends AsyncTask<Void, Void, Integer>{
        public Integer err = -1;        
    @Override
        protected void onPreExecute() {
            Log.d(TAG, "AsyncClic PreExecute ! ");      
    }
    @Override
    protected void onPostExecute(Integer result) {
    Log.d(TAG, "AsyncClic PostExecute ! ");
    //progressDialog.dismiss();
    }

    @Override
    protected Integer doInBackground(Void... arg0) {
    Log.d(TAG, "AsyncClic");
    return err;
    }
}

    class bActiverListener implements OnClickListener{          
    @Override
    public void onClick(View arg0) {
    clic.execute();
    while(!clic.getStatus().equals(AsyncTask.Status.FINISHED)){
        try {
        Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
        e.printStackTrace();
        }
        Log.d(TAG, "Waiting... clic=" + clic.getStatus());
    }
4

2 に答える 2

2

AsyncTask は、開始する機会さえ与えていないため、決して終了しません。

execute を呼び出すと、ループは doInBackground のスケジューリングを準備します。ただし、メイン スレッドでループしてスリープし、onClick から戻ることはなく、バックグラウンド スレッドで doInBackground をスケジュールする機会をルーパーに与えることもありません。

doInBackground がバックグラウンド スレッドでスケジュールされる前に戻る必要があります。

それか、すでに 10 個の asynctasks がスタックしています。

編集

完全ではありませんが、同じ考えです。

于 2013-04-04T12:25:26.860 に答える