0

您好,我是 android 和 android 线程的新手,所以想知道

我们如何使用更多数量的线程来执行每个任务或方法,以便当用户单击任何 UI 组件时它会影响性能,而对处理程序threadasynctask工作方式知之甚少。但是我们如何运行内部的每个方法asynctask如此做操作,意味着用户也可以做其他操作。

在应用程序中

  • 我有麦克风录音。
  • 接下来显示进度条。
  • 下一个显示带有一些图像的画廊以及对该图片的设置效果。
4

2 回答 2

0

使用AsyncTask并确保根据需要实施这些。你提到了在用户做某事时在后台做某事的想法,所以我猜你会想要改变 UI。

查看这些链接以了解更多来自 Android 的详细信息。它们覆盖RunnableAsyncTask并且Handler

我通常不会在此处粘贴完整的示例,但我很难找到一个我长期以来一直满意的示例并帮助您和其他人,这是我的首选方法。我通常使用AsyncTask一个回调来Activity启动任务。

在这个例子中,我假装用户触发onClick(...)了一个按钮,但可能是任何触发对Activity.

// Within your Activity, call a custom AsyncTask such as MyTask
public class MyActivity extends Activity implements View.OnClickListener, MyTask.OnTaskComplete {
    //...

    public void onClick(View v) {
        // For example, thet user clicked a button
        // get data via your task

        // using `this` will tell the MyTask object to use this Activty
        // for the listener
        MyTask task = new MyTask(this);
        task.execute(); // data returned in callback below
    }

    public void onTaskComplete(MyObject obj) {
        // After the AsyncTask completes, it calls this callback.
        // use your data here
        mTextBox.setText(obj.getName);
    }
}

可以通过多种方式从任务中获取数据,但我更喜欢OnTaskComplete上面实现并在下面触发的接口。

这里的主要思想是我经常想远离内部类,因为它们变得更加复杂。主要是个人喜好,但它允许我在一个类之外分离可重用的任务。

public class MyTask extends AsyncTask<Void, Void, MyObject> {

    public static interface OnTaskComplete {
        public abstract void onTaskComplete(MyObject obj);
    }
    static final String TAG = "MyTask";

    private OnTaskComplete mListener;

    public MyTask(OnTaskComplete listener) {
        Log.d(TAG, "new MyTask");
        if (listener == null)
            throw new NullPointerException("Listener may not be null");

        this.mListener = listener;
    }

    @Override
    protected MyObject doInBackground(Void... unused) {
        Log.d(TAG, "doInBackground");
        // do background tasks

        MyObbject obj = new MyObject();
        // Do long running tasks here to not block the UI
        obj.populateData();
        return 
    }

    @Override
    protected void onPostExecute(MyObject obj) {
        Log.d(TAG, "onPostExecute");
        this.mListener.onTaskComplete(obj);
    }
}
于 2013-02-19T15:28:33.290 回答
0

推荐的方法是使用AsyncTask来处理长时间运行的任务。因此,并非所有内容都需要使用 AsyncTasks 运行,因为上下文切换可能会影响性能。

至于 AsyncTasks 是如何工作的,请阅读文档。

于 2013-02-19T15:09:29.077 回答