android api studio - 동시에 여러 개의 AsyncTasks 실행 - 불가능합니까?



3 Answers

이렇게하면 API 4 이상 (Android 1.6 이상)의 모든 Android 버전에서 병렬 실행이 가능합니다.

@TargetApi(Build.VERSION_CODES.HONEYCOMB) // API 11
void startMyTask(AsyncTask asyncTask) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    else
        asyncTask.execute(params);
}

이것은 Arhimed의 훌륭한 대답을 요약 한 것입니다.

API 레벨 11 이상을 프로젝트 빌드 타겟으로 사용하십시오. Eclipse에서는 Project > Properties > Android > Project Build Target 입니다. API 수준을 낮추면 이전 버전과의 호환성이 깨지지 않습니다 . 실수로 minSdkVersion 보다 나중에 도입 된 기능을 사용하면 Lint 오류가 발생합니다. minSdkVersion 이후에 소개 된 기능을 실제로 사용하려면 주석을 사용하여 이러한 오류를 억제 할 수 있지만이 경우 직접 호환성을 고려해야합니다. 이는 위의 코드 스 니펫에서 정확히 일어난 일입니다.

parameters thread_pool_executor executeonexecutor

동시에 두 개의 AsyncTasks를 실행하려고합니다. (플랫폼은 Android 1.5, HTC Hero입니다.) 그러나 처음 만 실행됩니다. 다음은 내 문제를 설명하는 간단한 스 니펫입니다.

public class AndroidJunk extends Activity {
 class PrinterTask extends AsyncTask<String, Void, Void> {
     protected Void doInBackground(String ... x) {
      while (true) {
       System.out.println(x[0]);
       try {
        Thread.sleep(1000);
       } catch (InterruptedException ie) {
        ie.printStackTrace();
       }
      }
        }
    };

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

        new PrinterTask().execute("bar bar bar");
        new PrinterTask().execute("foo foo foo");

        System.out.println("onCreate() is done.");
    }
}

내가 예상하는 출력은 다음과 같습니다.

onCreate() is done.
bar bar bar
foo foo foo
bar bar bar
foo foo foo

등등. 그러나 내가 얻는 것은 :

onCreate() is done.
bar bar bar
bar bar bar
bar bar bar

두 번째 AsyncTask는 결코 실행되지 않습니다. execute () 문의 순서를 변경하면 foo 작업 만 출력을 생성합니다.

여기에 명백한 무언가가 빠져 있거나 바보 같은 짓을하고 있습니까? 동시에 두 개의 AsyncTasks를 실행할 수 있습니까?

편집 : 문제의 전화 안드로이드 1.5 실행, 나는 descr 문제를 업데이 트 깨달았다. 따라서. 안드로이드 2.1을 실행하는 HTC Hero에이 문제가 없습니다. 음 ...




@Sulai의 아주 좋은 요약에 @Arhimed의 뽀얀 대답에 최신 업데이트 (업데이트 4)를 포함시키기 만하면됩니다.

void doTheTask(AsyncTask task) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // Android 4.4 (API 19) and above
        // Parallel AsyncTasks are possible, with the thread-pool size dependent on device
        // hardware
        task.execute(params);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Android 3.0 to
        // Android 4.3
        // Parallel AsyncTasks are not possible unless using executeOnExecutor
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    } else { // Below Android 3.0
        // Parallel AsyncTasks are possible, with fixed thread-pool size
        task.execute(params);
    }
}



그것은 가능합니다. 내 안드로이드 장치 버전은 4.0.4이고 android.os.Build.VERSION.SDK_INT는 15입니다.

나는 3 개의 스피너가있다.

Spinner c_fruit=(Spinner) findViewById(R.id.fruits);
Spinner c_vegetable=(Spinner) findViewById(R.id.vegetables);
Spinner c_beverage=(Spinner) findViewById(R.id.beverages);

또한 Async-Tack 클래스가 있습니다.

여기 내 회 전자로드 코드입니다.

RequestSend reqs_fruit = new RequestSend(this);
reqs_fruit.where="Get_fruit_List";
reqs_fruit.title="Loading fruit";
reqs_fruit.execute();

RequestSend reqs_vegetable = new RequestSend(this);
reqs_vegetable.where="Get_vegetable_List";
reqs_vegetable.title="Loading vegetable";
reqs_vegetable.execute();

RequestSend reqs_beverage = new RequestSend(this);
reqs_beverage.where="Get_beverage_List";
reqs_beverage.title="Loading beverage";
reqs_beverage.execute();

이것은 완벽하게 작동합니다. 내 스피너가 하나씩로드되었습니다. 나는 사용자 executeOnExecutor를하지 않았다.

여기 내 Async-task 클래스가있다.

public class RequestSend  extends AsyncTask<String, String, String > {

    private ProgressDialog dialog = null;
    public Spinner spin;
    public String where;
    public String title;
    Context con;
    Activity activity;      
    String[] items;

    public RequestSend(Context activityContext) {
        con = activityContext;
        dialog = new ProgressDialog(activityContext);
        this.activity = activityContext;
    }

    @Override
    protected void onPostExecute(String result) {
        try {
            ArrayAdapter<String> adapter = new ArrayAdapter<String> (activity, android.R.layout.simple_spinner_item, items);       
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spin.setAdapter(adapter);
        } catch (NullPointerException e) {
            Toast.makeText(activity, "Can not load list. Check your connection", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        } catch (Exception e)  {
            Toast.makeText(activity, "Can not load list. Check your connection", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
        super.onPostExecute(result);

        if (dialog != null)
            dialog.dismiss();   
    }

    protected void onPreExecute() {
        super.onPreExecute();
        dialog.setTitle(title);
        dialog.setMessage("Wait...");
        dialog.setCancelable(false); 
        dialog.show();
    }

    @Override
    protected String doInBackground(String... Strings) {
        try {
            Send_Request();
            } catch (NullPointerException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        return null;
    }

    public void Send_Request() throws JSONException {

        try {
            String DataSendingTo = "http://www.example.com/AppRequest/" + where;
            //HttpClient
            HttpClient httpClient = new DefaultHttpClient();
            //Post header
            HttpPost httpPost = new HttpPost(DataSendingTo);
            //Adding data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);

            nameValuePairs.add(new BasicNameValuePair("authorized","001"));

            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            // execute HTTP post request
            HttpResponse response = httpClient.execute(httpPost);

            BufferedReader reader;
            try {
                reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                StringBuilder builder = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    builder.append(line) ;
                }

                JSONTokener tokener = new JSONTokener(builder.toString());
                JSONArray finalResult = new JSONArray(tokener);
                items = new String[finalResult.length()]; 
                // looping through All details and store in public String array
                for(int i = 0; i < finalResult.length(); i++) {
                    JSONObject c = finalResult.getJSONObject(i);
                    items[i]=c.getString("data_name");
                }

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}





Related