Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android异步任务不工作_Java_Android_Android Asynctask - Fatal编程技术网

Java android异步任务不工作

Java android异步任务不工作,java,android,android-asynctask,Java,Android,Android Asynctask,我使用AsyncTask执行耗时的操作,该操作扫描SD卡并将所有有效的照片绝对路径添加到ArrayList容器中。我将操作放入AsyncTask中执行。耗时的操作Utils.getPhotoList()放在doinbackground方法下。返回值被分配给onPostExecute方法下的全局变量list。从日志中,我知道该方法已执行,列表已分配一个值。但是为什么onStartCommand方法下的全局变量list总是null,这让我很困惑。请参阅下面的代码 ConcurrentAsyncTa

我使用AsyncTask执行耗时的操作,该操作扫描SD卡并将所有有效的照片绝对路径添加到ArrayList容器中。我将操作放入AsyncTask中执行。耗时的操作
Utils.getPhotoList()放在
doinbackground
方法下。返回值被分配给
onPostExecute
方法下的全局变量
list
。从日志中,我知道该方法已执行,
列表
已分配一个值。但是为什么
onStartCommand
方法下的全局变量
list
总是
null
,这让我很困惑。请参阅下面的代码

 ConcurrentAsyncTask.execute(new PhotoTask());
完整的代码是

public int onStartCommand(Intent intent, int flags, int startId) {
  if (isCameraUpload) {
    // execute time-consuming operation
    ConcurrentAsyncTask.execute(new PhotoTask());
  }
  // list is always null    
  if (list != null) {
    notifyUser(photosCount, repoName);
  }
  return START_STICKY;
}
自定义类ConcurrentAsyncTask是

public class ConcurrentAsyncTask {
   public static <T> void execute(AsyncTask<T, ?, ?> task, T...args) {
     if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR1) {
       task.execute(args);
     } else {
       task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, args);
     }
   }

   public static void execute(Runnable runnable) {
     execute(new SimpleAsyncTask(runnable));
   }
   private static class SimpleAsyncTask extends AsyncTask<Void, Void, Void> {
     Runnable runnable;
     public SimpleAsyncTask(Runnable runnable) {
       this.runnable = runnable;
     }
     public Void doInBackground(Void... args) {
     try {
       runnable.run();
     } catch(Exception e) {
       // ignore
     }
     return null;
   }

任何反馈都将不胜感激。谢谢

要解决这个问题,只需将操作分成几个部分即可。将耗时的操作放在doInbackground()方法中,将结果放在onPostExecute()方法中。

这是因为在启动AsyncTask后立即检查列表变量,该变量将为null或空。您需要将此签入AsyncTask的onPostExecute方法,然后从那里启动任何其他进程。如果您的AsyncTask位于另一个类中,则您的活动可以使用该接口通知调用方class@RajenRaiyarela那救了我,谢谢!
private class PhotoTask extends AsyncTask<Void, Void, List<SelectableFile>> {
   @Override
   protected List<SelectableFile> doInBackground(Void... params) {
     Log.d(DEBUG_TAG, "doInBackgroud");
     Log.d(DEBUG_TAG, "doInBackgroud:pathList.size: " + Utils.getPhotoList().size());
     return Utils.getPhotoList();
   }

   @Override
   protected void onPostExecute(List<SelectableFile> result) {
     Log.d(DEBUG_TAG, "onPostExecute");
     list = result;
     Log.d(DEBUG_TAG, "onPostExecute: list.size: " + list.size());
   }
 }