简体   繁体   English

带计时器的AsyncTask继续运行

[英]AsyncTask with Timer keeps on running

I have scheduled a AsyncTask using a Timer by following code 我通过以下代码使用Timer安排了AsyncTask

public void toCallAsynchronous() {
    TimerTask doAsynchronousTask;
    final Handler handler = new Handler();
    Timer timer = new Timer();


    doAsynchronousTask = new TimerTask() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            handler.post(new Runnable() {
                public void run() {

                    try {
                        if(mLoggedIn)
                        {
                            DownloadRandomPicture   download = new DownloadRandomPicture(this, mApi, CLIENT_ID, mImage);
                            download.execute();
                        }
                    } catch (Exception e) {
                        // TODO Auto-generated catch block


                    }

                }
            });

        }

    };

    timer.schedule(doAsynchronousTask, 0,50000);//execute in every 50000 ms

}
 @Override
    protected Boolean doInBackground(Void... params) {
try {
        if (mCanceled) {
            return false;
        }

        // Get the metadata for a directory
        Entry dirent = mApi.metadata(mPath, 1000, null, true, null);

        if (!dirent.isDir || dirent.contents == null) {
            // It's not a directory, or there's nothing in it
            mErrorMsg = "File or empty directory";
            return false;
        }

        // Make a list of everything in it that we can get a thumbnail for
        ArrayList<Entry> thumbs = new ArrayList<Entry>();
        for (Entry ent: dirent.contents) {
            if (ent.thumbExists) {
                // Add it to the list of thumbs we can choose from
                thumbs.add(ent);
            }
        }

        if (mCanceled) {
            return false;
        }

        if (thumbs.size() == 0) {
            // No thumbs in that directory
            mErrorMsg = "No pictures in that directory";
            return false;
        }

        // Now pick a random one
        int index = (int)(Math.random() * thumbs.size());
        Entry ent = thumbs.get(index);
        String path = ent.path;
        mFileLen = ent.bytes;


        String cachePath = mContext.getCacheDir().getAbsolutePath() + "/" + IMAGE_FILE_NAME;
        try {
            mFos = new FileOutputStream(cachePath);
        } catch (FileNotFoundException e) {
            mErrorMsg = "Couldn't create a local file to store the image";
            return false;
        }

        // This downloads a smaller, thumbnail version of the file.  The
        // API to download the actual file is roughly the same.
        mApi.getThumbnail(path, mFos, ThumbSize.BESTFIT_960x640,
                ThumbFormat.JPEG, null);
        if (mCanceled) {
            return false;
        }

        mDrawable = Drawable.createFromPath(cachePath);
        // We must have a legitimate picture
        return true;

    } catch (DropboxUnlinkedException e) {
        // The AuthSession wasn't properly authenticated or user unlinked.
    } catch (DropboxPartialFileException e) {
        // We canceled the operation
        mErrorMsg = "Download canceled";
    } catch (DropboxServerException e) {
        // Server-side exception.  These are examples of what could happen,
        // but we don't do anything special with them here.
        if (e.error == DropboxServerException._304_NOT_MODIFIED) {
            // won't happen since we don't pass in revision with metadata
        } else if (e.error == DropboxServerException._401_UNAUTHORIZED) {
            // Unauthorized, so we should unlink them.  You may want to
            // automatically log the user out in this case.
        } else if (e.error == DropboxServerException._403_FORBIDDEN) {
            // Not allowed to access this
        } else if (e.error == DropboxServerException._404_NOT_FOUND) {
            // path not found (or if it was the thumbnail, can't be
            // thumbnailed)
        } else if (e.error == DropboxServerException._406_NOT_ACCEPTABLE) {
            // too many entries to return
        } else if (e.error == DropboxServerException._415_UNSUPPORTED_MEDIA) {
            // can't be thumbnailed
        } else if (e.error == DropboxServerException._507_INSUFFICIENT_STORAGE) {
            // user is over quota
        } else {
            // Something else
        }
        // This gets the Dropbox error, translated into the user's language
        mErrorMsg = e.body.userError;
        if (mErrorMsg == null) {
            mErrorMsg = e.body.error;
        }
    } catch (DropboxIOException e) {
        // Happens all the time, probably want to retry automatically.
        mErrorMsg = "Network error.  Try again.";
    } catch (DropboxParseException e) {
        // Probably due to Dropbox server restarting, should retry
        mErrorMsg = "Dropbox error.  Try again.";
    } catch (DropboxException e) {
        // Unknown error
        mErrorMsg = "Unknown error.  Try again.";
    }
    return false;
}
protected void onProgressUpdate(Long... progress) {
        int percent = (int)(100.0*(double)progress[0]/mFileLen + 0.5);
        //mDialog.setProgress(percent);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        //mDialog.dismiss();
        if (result) {
            // Set the image now that we have it
            mView.setImageDrawable(mDrawable);
        } else {
            // Couldn't download it, so show an error
            showToast(mErrorMsg);
        }
    }

I am calling this from onCreate of my activity. 我从我的活动的onCreate调用此方法。 My async task basically downloads some data from server. 我的异步任务基本上是从服务器下载一些数据。 Main activity allows user to login to server and then I go for fetching the data. 主要活动允许用户登录到服务器,然后我去获取数据。 The problem that I am facing is that each AsyncTask creates its own thread. 我面临的问题是每个AsyncTask都会创建自己的线程。 Also, none of those goes to completion.The thread status is always running. 同样,这些都没有完成。线程状态始终处于运行状态。 Is there a way to check that the new AsyncTask is only launched when the earlier is finished. 有没有办法检查新的AsyncTask仅在较早的版本完成时才启动。

Try this way 试试这个

public ArrayBlockingQueue<Runnable> threadList = new ArrayBlockingQueue<Runnable>(
        2000, true);
public ThreadPoolExecutor threadPool = new ThreadPoolExecutor(0,
        2000, 1000, TimeUnit.MILLISECONDS, threadList);

TimerTask t=new TimerTask() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    //your code here
                }
            };    

ThreadPool.execute(t);

The line timer.schedule(doAsynchronousTask, 0,50000);//execute in every 50000 ms is responsible for the repetitive task. timer.schedule(doAsynchronousTask, 0,50000);//execute in every 50000 ms操作负责重复性任务。

As per the description of Timer class's schedule( TimerTaskObject, int start, int repete ) method , this will repeat a particular TimerTask for the defined time interval, i suggest you to change it as follows, 根据Timer类的schedule(TimerTaskObject,int start,int repete)方法的描述,这将在定义的时间间隔内重复执行特定的TimerTask,我建议您按以下方式进行更改,

timer.schedule(doAsynchronousTask, 1000);//execute once after one second

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM