相关疑难解决方法(0)

同时运行多个AsyncTasks - 不可能?

我正在尝试同时运行两个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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

我期望的输出是:

onCreate() is done.
bar bar bar
foo foo foo
bar bar bar
foo foo foo
Run Code Online (Sandbox Code Playgroud)

等等.但是,我得到的是:

onCreate() is done. …
Run Code Online (Sandbox Code Playgroud)

multithreading android android-asynctask

249
推荐指数
4
解决办法
17万
查看次数

AsyncTask doInBackground不运行

我遇到了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 android-asynctask

34
推荐指数
3
解决办法
4万
查看次数

在调用AsyncTask :: execute之后,AsyncTask的doInBackground开始执行得太晚

我写了一个AsyncTask,大部分时间它的构造函数被调用并且其doInBackground被调用(0毫秒延迟)之间没有延迟.但是每当在后台进行联系人同步时,我的AsyncTasks的构造函数和doInBackground之间经常会有1-3秒的延迟.在我的情况下,这种延迟是不可接受的.我知道AsyncTask是一个后台线程,这个问题可以通过使用Thread并将其优先级设置得更高来解决.但我想知道的是,我怎么知道是什么导致我的AsyncTask的doInBackground被调用?我使用了adb shell top -m 10,当这个问题发生时,进程使用似乎很正常.

任何帮助表示赞赏.

谢谢

android android-asynctask

13
推荐指数
2
解决办法
5635
查看次数

从Handler调用的AsyncTask不会执行doInBackground

我正在使用的应用程序是使用后台线程通过API下载图像列表,然后以幻灯片形式显示图像.

有一个后台任务(当前是AsyncTask)来定期获取新图像.

我没有得到关于错误的线程等的任何错误消息,只是AsyncTasks的第二个实例不会运行doInBackground方法.

以下是Activity的一些代码:

private DownloadTask mDownloadTask = null;
private Handler mHandler;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if(mDownloadTask != null) {
                mDownloadTask.cancel(true);
            }
            mDownloadTask = new DownloadTask();
            mDownloadTask.execute((Void[]) null);
        }
    };

    mDownloadTask = new DownloadTask();
    mDownloadTask.execute((Void[]) null);
}
Run Code Online (Sandbox Code Playgroud)

DownloadTask如下所示:

@Override
protected List<String> doInBackground(Void... voids) {
     // Download list of URLs from server, etc.
}

@Override
protected void onPostExecute(List<String> urls) {
    mHandler.sendEmptyMessageDelayed(111, 5000);
}
Run Code Online (Sandbox Code Playgroud)

将调用该处理程序,将调用onPreExecute(在AsyncTask中)并且DownloadTask的初始运行(右上onCreate …

android android-asynctask

12
推荐指数
1
解决办法
1万
查看次数

Android:Asynctask的doInBackground方法在长时间延迟后调用

我一直在尝试从网址下载视频,我已经在asynctask的doInBackground()中实现了我的下载方法,但是doInBackground方法花了很多时间来调用(5-10分钟),我正在使用另一个asyntask在我从事的活动中下载图像,以下载视频活动及其工作正常.我的onPreExecute方法正在按时调用,但之后doInBackground需要大约5-7分钟才能启动.我将非常感谢您提供的任何帮助.这是我的代码

btnDownloadLQ.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) 
            {
                try
                {
                    new DownloadVideoTask().execute(videoURL);

                }
                catch(Exception e)
                {
                    Log.e("Vidit_TAG","I got an error",e);
                }
            }
        });

private class DownloadVideoTask extends AsyncTask<String, String, String> 
    {

        @SuppressWarnings("deprecation")
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showDialog(DIALOG_DOWNLOAD_PROGRESS);
        }

        protected String doInBackground(String... urls) 
        {
            int i=0;
            try
            {
                URL url = new URL (urls[0]);
                InputStream input = url.openStream();

                try {
                    //The sdcard directory e.g. '/sdcard' can be used directly, or 
                    //more safely abstracted with getExternalStorageDirectory()
                    String root …
Run Code Online (Sandbox Code Playgroud)

android android-asynctask

11
推荐指数
2
解决办法
5464
查看次数

创建AsyncTask需要花费太多时间Android

我在AsyncTask中进行网络调用,但我面临的问题是启动doInBackground方法所花费的时间.

这是我的代码的一部分:

    button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("Temp:",System.currentTimeMillis()+"");
                new Move().execute();
                /*some other logic
            }
    }
Run Code Online (Sandbox Code Playgroud)

我的AsyncTask是:

    private class Move extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... temp) {
        Log.d("start:",System.currentTimeMillis()+"");
        gson.fromJson(Web.Request.get(some_URL),Void.class);
        Log.d("end:",System.currentTimeMillis()+"");
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是我得到的日志:

           32658-998/com.example.game D/temp:? 1408923006159
           32658-998/com.example.game D/start:? 1408923035163
           32658-998/com.example.game D/end:? 1408923035199
Run Code Online (Sandbox Code Playgroud)

实际上,在doInBackground方法中到达第一行几乎需要29秒,因为完成网络调用只花了36毫秒.我尝试了很多次,所用的时间几乎是一样的.

是否可以立即启动AsyncTask?或者有没有其他方法来解决这个问题.(除了运行一个简单的线程?)谢谢:)

android android-asynctask

7
推荐指数
2
解决办法
2893
查看次数

Android AsyncTask - 为什么不执行doInBackground()?

我有一个包含以下方法的嵌套片段:

public void onSave() {
    if (getActivity() == null || view == null) return;
    if (file != null && file.exists()) {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected void onPreExecute() {
                Log.d("log", "onPreExecute of save ex");
            }

            @Override
            protected Void doInBackground(Void... params) {

                Log.d("log", "doInBackground of save ex");
                //DO SOMETHING
                return null;
            }

            protected void onPostExecute(Void result) {
                BaseFragment fragment = new LocalListFragment();
                ((LocalLauncherFragment)(LocalEditFragment.this.getParentFragment())).setFragment(fragment);
                Log.d("log", "end of save ex");
            };
        }.execute();
    } else {
        showAlert();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我第一次调用此方法,它将执行直到onPostExecute().但是,如果我转到其他片段并重新打开此片段(通过创建一个新的片段对象并替换它),则只执行onPreExecute().为什么这个asyncTask对象第二次没有很好地执行?

如果我使用executeOnExecutor()那么它会在第二次正常工作.但为什么不执行()工作?AsyncTask的生活是否与片段或其他东西联系在一起?

提前致谢!

android fragment android-asynctask

6
推荐指数
1
解决办法
9184
查看次数

在android中安排多个异步任务

我想安排或排队在后台执行Multiple AsyncTask.我有一个在Service中运行的HTTP post请求的AsyncTask,同时我在AsyncTask的UI线程中再发一个HTTP请求.

UI线程执行时间太长,因为已经有一个线程在服务中运行.如何解决这个问题.

我需要暂停服务线程,我想首先执行UI线程,然后再次为AsyncTask重新启动服务线程.

提前致谢

java multithreading android priority-queue android-asynctask

6
推荐指数
1
解决办法
1043
查看次数