您好,我是 android 和 android 线程的新手,所以想知道
我们如何使用更多数量的线程来执行每个任务或方法,以便当用户单击任何 UI 组件时它会影响性能,而对处理程序thread
和asynctask
工作方式知之甚少。但是我们如何运行内部的每个方法asynctask
如此做操作,意味着用户也可以做其他操作。
在应用程序中
- 我有麦克风录音。
- 接下来显示进度条。
- 下一个显示带有一些图像的画廊以及对该图片的设置效果。
您好,我是 android 和 android 线程的新手,所以想知道
我们如何使用更多数量的线程来执行每个任务或方法,以便当用户单击任何 UI 组件时它会影响性能,而对处理程序thread
和asynctask
工作方式知之甚少。但是我们如何运行内部的每个方法asynctask
如此做操作,意味着用户也可以做其他操作。
在应用程序中
使用AsyncTask
并确保根据需要实施这些。你提到了在用户做某事时在后台做某事的想法,所以我猜你会想要改变 UI。
查看这些链接以了解更多来自 Android 的详细信息。它们覆盖Runnable
,AsyncTask
并且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);
}
}
推荐的方法是使用AsyncTask来处理长时间运行的任务。因此,并非所有内容都需要使用 AsyncTasks 运行,因为上下文切换可能会影响性能。
至于 AsyncTasks 是如何工作的,请阅读文档。