我稍微感到困惑之间的差异Handlers,AsyncTask并Threads在Android中.我在stackoverflow中阅读了很多博客和问题.
Handler是后台线程,提供您与UI进行通信.例如,更新进度条应该通过Handler.使用处理程序可以获得优势MessagingQueues,因此,如果要计划消息或更新多个UI元素或具有重复任务.
AsyncTask类似的,实际上它们使用Handler但不在UI线程中运行,因此它对于获取数据很有用,例如获取Web服务.稍后您可以与UI进行交互.
Thread然而,无法与UI交互,提供更多"基本"线程,你错过了所有的抽象AsyncTask.
但是,我想在服务中运行套接字连接.应该在处理程序或线程中运行,还是在AsyncTask?根本不需要UI交互.它在我使用的性能方面有所不同吗?
与此同时,文件已得到重大改进.
Google 正在弃用 Android 11 中的 Android AsyncTask API,并建议java.util.concurrent改用。你可以在这里查看提交
*
* @deprecated Use the standard <code>java.util.concurrent</code> or
* <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
* Kotlin concurrency utilities</a> instead.
*/
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {
Run Code Online (Sandbox Code Playgroud)
如果您在 Android 中维护带有异步任务的旧代码库,则将来可能需要对其进行更改。我的问题是,使用java.util.concurrent. 它是一个 Activity 的静态内部类。我正在寻找可以使用的东西minSdkVersion 16
private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> {
private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName();
private WeakReference<MyActivity> activityReference;
LongRunningTask(MyActivity context) {
activityReference = new WeakReference<>(context);
}
@Override
protected MyPojo doInBackground(String... params) { …Run Code Online (Sandbox Code Playgroud) 截至2012年2月15日,我还没有找到一个很好的解释,也不知道为什么这不起作用.最接近解决方案的是使用传统的Thread方法,但为什么要包含一个在Android SDK中没有(似乎)工作的类?
Evenin'SO!
我有一个AsyncTask子类:
// ParseListener had a callback which was called when an item was parsed in a
// RSS-xml, but as stated further down it is not used at all right now.
private class xmlAsync extends AsyncTask<String, RSSItem, Void> implements ParseListener
Run Code Online (Sandbox Code Playgroud)
这是这样执行的:
xmlAsync xmlThread = new xmlAsync();
xmlThread.execute("http://www.nothing.com");
Run Code Online (Sandbox Code Playgroud)
现在这个子类遇到了一点错误.以前它做了一些xml-parsing,但是当我注意到它的doInBackground()没有被调用时,我逐行删除它,最后以这样结束:
@Override
protected Void doInBackground(String... params)
{
Log.v(TAG, "doInBackground");
return null;
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,没有记录任何内容.但是,我补充说:
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
Run Code Online (Sandbox Code Playgroud)
并且在执行线程时确实记录了该行.所以不知何故onPreExecute()被调用但不是doInBackground().我在后台同时运行另一个AsyncTask,效果很好.
我目前正在模拟器上运行应用程序,SDK版本15,Eclipse,Mac …
我遇到了AsyncTask类的问题.在创建4个或5个任务后,我的任务似乎停止了.
我有2个活动.MainActivity只包含一个按钮,用于启动名为ImageActivity的第二个活动.
ImageActivity非常简单.它有一个onCreate设置布局,然后它启动一个新的AsyncTask,从Internet加载图像.这在前几次工作正常.但它突然停止工作.每次运行onPreExecute方法,但不运行doInBackground方法.我试图用睡眠循环简化doInBackground,同样的事情发生了.我无法理解这种行为,因为asynctask在onDestroy方法中都被取消并设置为null.所以每次我开始一个新的ImageActivity,我也会创建一个新的AsyncTask.
我通过点击后退按钮重新创建ImageActivity和任务,而不是单击MainActivity上的按钮.
任何人的想法?我真的很挣这个.
更新:启动ImageActivity的代码(在onClickListener按钮内)
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.setClassName(this, ImageActivity.class.getName());
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
上面的代码开始此活动
public class ImageActivity extends Activity {
private AsyncTask<Void, Void, Void> task;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
task = new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute()
{
Log.d(TAG, "onPreExecute()");
}
@Override
protected Void doInBackground(Void... params)
{
Log.d(TAG, "doInBackground() -- Here is the download");
// downloadBitmap("http://mydomain.com/image.jpg")
return null;
}
@Override
protected void onPostExecute(Void res)
{
Log.d(TAG, "onPostExecute()");
if(isCancelled()){
return;
}
}
}.execute(); …Run Code Online (Sandbox Code Playgroud) 我正在使用Android SDK 4.0.3 API15,我希望并行运行多个AsyncTasks.我从Web服务器获取数据并实时动画(10 fps).但是根据用户操作,我还需要将一些数据发送到Web服务器.当发生这种情况时,我的动画暂停一小段时间(发送数据进入队列并获取数据等待它完成)因此我无法捕捉实时.
这个答案很有说服力,但我无法使其发挥作用.所以任何帮助都将非常感激.
我想我需要使用这个功能来实现:
AsyncTask.executeOnExecutor(Executor exec, Params... params)
Run Code Online (Sandbox Code Playgroud)
但我无法将执行程序作为参数传递,我无法实例化执行程序.这是我的AsyncTask类:
public class GetPlayers extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
rawData="";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
if((rawData = buffer.readLine()) == null){
rawData = "error";
}
} catch (Exception e) {
e.printStackTrace();
}
}
return …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有两个活动.在我的活动A中,我使用一个AsyncTask,第二个活动B也使用另一个AsyncTask.在我的活动A中,我将一些数据上传到服务器,在我的活动B中,我正在尝试从服务器下载一些其他数据.这两个都在AsyncTask中运行.我的问题是当我尝试从Activity中下载数据时,onPreExecute()调用了Activity B 方法,但是doInBackground()没有调用方法,它正在等待第一个Activity A的doInBackground()操作完成.为什么会这样?是否可以同时运行多个后台操作..
在活动A中
ImageButton submit_button = (ImageButton) findViewById(R.id.submit_button);
submit_button.setOnClickListener(new OnClickListener()
{
public void onClick(View record_button)
{
new Save_data().execute();
}
});
class Save_data extends AsyncTask<String, Integer, Integer>
{
protected void onPreExecute()
{
}
protected Integer doInBackground(String... arg0)
{
//uploading data here
}
}
Run Code Online (Sandbox Code Playgroud)
在我的活动B中
ImageButton get_button = (ImageButton) findViewById(R.id.get_button);
get_button.setOnClickListener(new OnClickListener()
{
public void onClick(View record_button)
{
new download_process().execute();
}
});
class download_process extends AsyncTask<String, integer, integer>
{
protected void onPreExecute()
{
Log.e("pre-execute","has …Run Code Online (Sandbox Code Playgroud) 我已经开发了一个Activity,它将解析JSON数据并在ListView中显示结果.我正在为此目的使用AsyncTask.
我现在想要的是,当我点击ListView中的某个项目时,该文件应该开始下载.我可以在同一个活动中编写另一个AsyncTask,以便这个AsyncTask会为我做下载工作吗?在同一个活动中有多个AsyncTasks有什么问题吗?
我知道有很多问题,我也读过这个页面.但是,我仍然对确切的选择感到困惑.
如果我有一部运行Android 2.3.6的手机
我知道Minimum Required SDK应该是我的应用支持的Android的最低版本.因此,例如,我会选择Android 2.2或小于该值Android 1.5
令人困惑的部分Target SDK和Compile with
我在下面安装了以下内容:( Android 2.3.6SDK管理器中没有)
Android 4.2.2(API 17)
Android 3.0(API 11)
Android 2.3.3(API 10)
Android 2.2(API 8)
是Target SDK应设置为这是最大的Android 4.2.2,不管是什么我的手机使用; 这是Android 2.3.6?
选择Android 4.2.2将涵盖下面的所有手机?是对的吗?
要么
它应该设置为我的手机的确切/最接近的值.这是可用的Android 2.3.3?但不要超过我的手机Android 2.3.6
是Compile with必须设置为最大值Android 4.2.2还是什么?
我使用v4 support lib的FragmentTabHost
要求是当我将标签切换到另一个和另一个标签时,即调用
每次onCreateView()和onActivityCreated().
这就是我的代码性能很慢的原因.
那么,还有其他解决方案吗 如何提高片段选项卡的性能?
我有同样的问题同时运行多个AsyncTasks - 不可能吗? 除了我使用android 4.0与android:minSdkVersion ="14".
我试过他的例子,并得到:
bar bar bar
bar bar bar
bar bar bar
Run Code Online (Sandbox Code Playgroud)
编辑:
我在这里找到了解决方案
而不是使用:
task.execute();
Run Code Online (Sandbox Code Playgroud)
使用 :
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
Run Code Online (Sandbox Code Playgroud) multithreading android android-asynctask android-4.0-ice-cream-sandwich