2016-04-01 22 views
0

olarak adlandırılır Benim AsyncTask benim MainActivity içinde yürütülür, ancak onPostExecute çağırmaz. DoInBackground yöntemi, return deyimine (System.out ile kontrol edilir) kadar tamamlanır!onPostExecute yalnızca bazen AsyncTask

Çağrı:

@Override 
protected void onStart() { 
    super.onStart(); 

    if (playIntent == null) { 
     playIntent = new Intent(this, MusicService.class); 

     if (CheckPermissions()) { 
      Prepare(); 
     } 
    } 
} 

private void Prepare() { 
    MusicStore musicStore = new MusicStore(getApplicationContext()); 

    sSongs = musicStore.getSongs(); 

    StoreParcel storeParcel = new StoreParcel(StoreParcel.StoreAction.READ_PLAYLISTS, this); 

    musicStore.execute(storeParcel); 

    if (sSongs.length < 1) { 
     fabPlayPause.hide(); 

     snbInformation = Snackbar.make(recyclerView, getString(R.string.snb_Information) + "Music.", Snackbar.LENGTH_INDEFINITE); 
     snbInformation.show(); 
    } 
    else { 
     fabPlayPause.show(); 
    } 

    bindService(playIntent, musicServiceConn, BIND_AUTO_CREATE); 

    startService(playIntent); 
} 

AsyncTask:

public class MusicStore extends AsyncTask<StoreParcel, Void, StoreParcel> { 
    private Context mContext; 

    public MusicStore(Context context) { 
     mContext = context; 
    } 

    //region AsyncTask 

    @Override 
    protected StoreParcel doInBackground(StoreParcel... params) { 
     StoreParcel parcel = params[0]; 

     StoreParcel storeParcel = new StoreParcel(parcel.getAction(), parcel.getPlaylistInterface()); 

     switch (parcel.getAction()) { 
      case WRITE_PLAYLISTS: 
       WritePlaylists(parcel.getPlaylists()); 
       break; 
      case READ_PLAYLISTS: 
       storeParcel.setPlaylists(ReadPlaylists()); 
       break; 
     } 

     return storeParcel; 
    } 

    @Override 
    protected void onPostExecute(StoreParcel storeParcel) { 
     if (storeParcel.getAction() == StoreParcel.StoreAction.READ_PLAYLISTS) { 
      storeParcel.getPlaylistInterface().SyncPlaylists(storeParcel.getPlaylists()); 
     } 

     super.onPostExecute(storeParcel); 
    } 

    //region Methods 

    private void WritePlaylists(Playlist[] playlists) { 
     File dir = new File(mContext.getFilesDir() + Preferences.dirPlaylists); 

     if (!dir.exists()) { 
      dir.mkdirs(); 
     } 

     for (File f : dir.listFiles()) { 
      f.delete(); 
     } 

     if (playlists == null) return; 

     String sFilename; 
     File file; 

     for (int i = 0; i < playlists.length; i++) { 
      sFilename = playlists[i].getName(); 

      try { 
       file = new File(dir, sFilename + ".json"); 
       file.createNewFile(); 

       Writer writer = new OutputStreamWriter(new FileOutputStream(file)); 

       Gson gson = new GsonBuilder().create(); 
       gson.toJson(playlists[i], writer); 

        writer.close(); 
      } 
      catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 
    } 

    private Playlist[] ReadPlaylists() { 
     Playlist[] playlists; 

     File dir = new File(mContext.getFilesDir() + Preferences.dirPlaylists); 

     File[] files = dir.listFiles(); 

     if (files == null) return null; 

     playlists = new Playlist[files.length]; 

     Reader reader = null; 

     try { 
      for (int i = 0; i < files.length; i++) { 
       reader = new InputStreamReader(new FileInputStream(files[i])); 

       Gson gson = new GsonBuilder().create(); 
       playlists[i] = gson.fromJson(reader, Playlist.class); 
      } 

      if (reader != null) reader.close(); 
     } 
     catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 

     return playlists; 
    } 

    //endregion 

    //endregion 
} 

StoreParcel bana yarattığı bir sınıftır! Sadece bir Arabirim ve Enum Değeri toplar!

+0

Tüm "AsyncTask" ifadesini, "class" ile gönderebilir misiniz? –

+0

Bu yüzden tüm MusicStore sınıfını ekledim! –

+0

Size garanti edebilirim onPostExecute her zaman çağrılır, ancak 'storeParcel.getAction()' bazen READ_PLAYLISTS –

cevap

0

Sanırım işiniz onResume'de çalıştırılmalı, böylece siz varsınız. Kullanıcı arabiriminde onStart yapabilir ve onPostExecute, UI iş parçacığı üzerinde çalışmalıdır.

@Override 
protected void onStart() { 
    super.onStart(); 

    if (playIntent == null) { 
    playIntent = new Intent(this, MusicService.class); 
    } 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    if (CheckPermissions()) { 
     Prepare(); 
    } 
} 
+0

UI'nin donmuş olması olabilir, çünkü “with (! BPlaylistsLoaded) {}' ile birlikte, MainPhilence'deki onPostExecute'u bekliyorum. –

+0

Belki. AsyncTask'ın kullanıcı arabirimini ve çalışan iş parçacığını sizin için işlediğinden beri buna gerek yok. –

+0

Tamam, bunu kaldırdığımdan, kodum çalışıyor! –

İlgili konular