0

2つの異なるクラスに2つのAsyncTaskがありますが、問題は、最初のタスクがバックグラウンド状態で実行され、2番目のクラスが実行されない場合です。5秒ごとに新しいデータを更新する必要があるため、ループで実行された場合の最初のasyncTask。タスクを停止すると(条件=フレア)、2番目のタスクは完全に機能します。

ファーストクラス:

public class MapScreen extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map_screen);

        UpdateUserCords updateUC = new UpdateUserCords();
        updateUC.execute();
    }

class UpdateUserCords extends AsyncTask<String, Void, String> 
{


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


        while(condition)
        {

            //some code in loop...


            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return null;

    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Void... values) {


        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {


        super.onPostExecute(result);
    }
}

}

2番目のクラス:

public class Groups extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_groups);


    getGroups getGr = new getGroups();
    getGr.execute(); //not executing, no error or crash


}


class getGroups extends AsyncTask<String, Void, String> 
{


    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

    @Override
    protected String doInBackground(String... params) {
        //some code...
        return null;
    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);
    }


}
}
4

3 に答える 3

3

Android API 11以降、AsyncTasksはデフォルトでシリアルエグゼキュータで実行を開始しました。これは、一度に1つのタスクのみが実行されることを意味します。で実行されているAPI11より前の動作を取得するにはThreadPoolExecutor、次のようなコードで指定する必要があります。

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
  myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
else {
  myTask.execute();
}

詳細については、こちらをご覧ください: http ://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

幸運を!

PSAsyncTask無限スレッドに使用することはお勧めしません。目的はバックグラウンドでタスクを実行することであり、永久に実行することではありません。したがって、無限スレッドが必要な場合は、としてではなく、AsyncTaskとして作成する必要があると思います。ThreadAsyncTask

于 2013-01-08T21:15:49.620 に答える
0

asynctasks は 2 つの異なるアクティビティにあります。一度にアクティブになるアクティビティは 1 つだけです。

于 2013-01-08T21:07:47.643 に答える
-1

両方のクラスが Activity を拡張し、そのうちの 1 つだけが同時に実行されます。アクティビティの存続期間よりも長くタスクを実行したい場合は、それをServiceにラップする必要があります

于 2013-01-08T21:10:17.210 に答える