AsyncTask



Android 中的 AsyncTask 可以比较容易实现异常操作,

由于其doInBackground是在后台线程中执行,而 onPostExecute 是在UI线程中执行,所以广泛用于异步运算后更新界面。

多线程并发

从 HONEYCOMB (3.0)开始,Android中的AsyncTask只会在一个后台线程中运行,如果想要并发操作,需要调用 executeOnExecutor(java.util.concurrent.Executor, Object[]) 方法,在该方法中指定Executor来进行并发。

为了让代码能在新老版本中同时运行,可以判断AsyncTask有无executeOnExecutor方法,然后进行不同的处理。下面是一个示例。

import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    private Method executorMethod = null;
    private Executor executor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            executorMethod = AsyncTask.class.getMethod("executeOnExecutor", Executor.class, Object[].class);
            if (executorMethod != null) {
                executor = Executors.newFixedThreadPool(3);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Button button = (Button) findViewById(R.id.button);
        final TextView textView = (TextView) findViewById(R.id.text);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AddTask task = new AddTask(textView);
                if (executorMethod == null) {
                    task.execute(1, 2, 3, 4, 5);
                } else {
                    try {
                        executorMethod.invoke(task, executor, new Integer[] { 1, 2, 3, 4, 5 });
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    private class AddTask extends AsyncTask<Integer, Void, Integer> {
        private TextView textView;
        
        public AddTask(TextView textView) {
            super();
            this.textView = textView;
        }

        @Override
        protected Integer doInBackground(Integer... ints) {
            int total = 0;
            for (int i = 0; i < ints.length; i++) {
                total += ints[i];
            }
            return total;
        }

        @Override
        protected void onPostExecute(Integer result) {
            textView.setText("Result: " + result);
        }
    }
}

参考

  • http://developer.android.com/reference/android/os/AsyncTask.html

声明: 本文采用 CC BY-NC-SA 3.0 协议进行授权,转载请注明出处。