2013-08-07 2 views
3

이미이 문제에 대한 모든 유사한 스레드에 보면 한 전화 해달라고,하지만 난 내 문제에 대한 해결책을 찾을 수 없습니다AsyncTask를 publishProgress는 onProgressUpdate가

보관함에서 파일을 다운로드 및 통지의 진행 상황을 표시해야 내 AsynkTask 진행 표시 줄. doInBackground는 파일을 다운로드하지만 publishProgress/onProgressUpdate 메소드가 제대로 작동하지 않습니다. onProgressUpdate가 호출되지 않습니다.

AsyncTask를

public class SongDownload extends AsyncTask<String, String, String> { 

    DropboxAPI<AndroidAuthSession> dDBApi; 
    Context context; 
    Dropbox db; 
    SharedPreferences prefs; 
    NotificationManager mNotifyManager; 
    Notification notification; 
    String datei; 

    public SongDownload(Context context, Dropbox db) { 
     this.db = db; 
     this.context = context; 
     Log.v("mp3dropboxsync", "SongDownload"); 

     mNotifyManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     Notification notification = new Notification(R.drawable.ic_launcher, "Neuer DropBox Song!", System.currentTimeMillis()); 

     RemoteViews views = new RemoteViews(context.getApplicationContext() 
       .getPackageName(), R.layout.notiprogressbar); 
     views.setProgressBar(R.id.progressBar1, 100, 0, false); 
     views.setTextViewText(R.id.status_text, "Song Downloading..."); 

     notification.contentView = views; 

     notification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONGOING_EVENT; 

     mNotifyManager.notify(10, notification); 

    } 

@Override 
protected String doInBackground(String... dropboxFile) { 

    Log.v("mp3dropboxsync", "DoinBackground"); 
    File file = new File(Environment.getExternalStorageDirectory().getPath()+"/MP3/sonstiges/"+dropboxFile[0]); 
    datei = dropboxFile[0]; 
    BufferedOutputStream out=null; 
    try { 

     if(!file.exists()) 
     { 

     out = new BufferedOutputStream(new FileOutputStream(file)); 
     db.mDBApi.getFile("/MP3/"+dropboxFile[0], null, out, new ProgressListener() { 

      @Override 
      public void onProgress(long bytes, long total) { 

       try { 
        Log.v("mp3dropboxsync", "onProgress"); 
        String s = ""+(bytes/(float)total)*100; 
        publishProgress(s); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        Log.v("mp3dropboxsync", "onProgressERROR"); 
       } 

      } 
     }); 



     } 
    } catch (DropboxException e) { 
     Log.v("mp3dropboxsync", "Something went wrong while downloading."); 
     file.delete(); 
    } catch (FileNotFoundException e) { 
     Log.v("mp3dropboxsync", "File not found."); 
    } catch (Exception e) { 
     Log.v("mp3dropboxsync", "Unbekannter Fehler: "+e.getMessage()); 
    } finally { 
     if (out != null) { 
      try { 
       out.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     else 
      dropboxFile[0] = ""; 
    } 
    return dropboxFile[0]; 
} 

@Override 
protected void onProgressUpdate(String... progress) { 
    super.onProgressUpdate(progress); 

    try { 
     int percent = Integer.parseInt(progress[0]); 
     Log.v("mp3dropboxsync","Hi progressing - " + percent + "%"); 

     notification.contentView.setProgressBar(R.id.progressBar1, 100, percent, false); 
     notification.contentView.setTextViewText(R.id.status_text, "Downloading... "+datei); 

     mNotifyManager.notify(10, notification); 

    } catch (NumberFormatException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

@Override 
protected void onPostExecute(String result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 

    Log.v("mp3dropboxsync","OnPostExecute"); 

    mNotifyManager.cancel(10); 
} 


} 

로그 캣은

08-07 15:14:54.716: I/System.out(29125): waiting for debugger to settle... 
08-07 15:14:54.926: I/System.out(29125): debugger has settled (1366) 
08-07 15:14:55.496: D/libEGL(29125): loaded /system/lib/egl/libGLES_android.so 
08-07 15:14:55.527: D/libEGL(29125): loaded /system/lib/egl/libEGL_adreno200.so 
08-07 15:14:55.557: D/libEGL(29125): loaded /system/lib/egl/libGLESv1_CM_adreno200.so 
08-07 15:14:55.567: D/libEGL(29125): loaded /system/lib/egl/libGLESv2_adreno200.so 
08-07 15:14:55.577: V/mp3dropboxsync(29125): OnStartCommand 
08-07 15:14:55.577: V/mp3dropboxsync(29125): In Auth 
08-07 15:14:55.577: V/mp3dropboxsync(29125): Nach Auth - linked: true 
08-07 15:14:55.577: V/mp3dropboxsync(29125): Dropbox GetListe 
08-07 15:14:55.677: I/Adreno200-EGLSUB(29125): <ConfigWindowMatch:2078>: Format RGBA_8888. 
08-07 15:14:55.717: D/memalloc(29125): ashmem: Mapped buffer base:0x5266b000 size:1536000 fd:63 
08-07 15:14:55.727: D/OpenGLRenderer(29125): Enabling debug mode 0 
08-07 15:14:55.967: I/global(29125): In close() at SocketHttpClientConnection 
08-07 15:14:55.987: D/memalloc(29125): ashmem: Mapped buffer base:0x52e0c000 size:1536000 fd:67 
08-07 15:15:03.464: V/mp3dropboxsync(29125): SongDownload 
08-07 15:15:03.484: V/mp3dropboxsync(29125): DoinBackground 
08-07 15:15:03.624: I/global(29125): In close() at SocketHttpClientConnection 
08-07 15:15:06.517: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:07.108: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:07.628: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:08.149: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:08.659: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:09.200: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:09.740: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:10.261: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:10.801: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:11.402: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:11.943: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:12.463: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:12.974: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:13.494: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:14.005: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:14.585: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:15.146: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:15.696: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:16.247: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:16.847: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:17.398: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:17.928: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:18.439: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:19.009: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:19.550: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:20.090: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:20.621: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:21.242: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:21.742: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:22.283: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:22.793: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:23.304: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:23.954: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:24.545: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:25.075: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:25.606: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:25.936: I/global(29125): In close() at SocketHttpClientConnection 
08-07 15:15:25.936: I/global(29125): call socket close in SocketHttpClientConnection, socket=SSL socket over Socket[address=/199.47.219.158,port=443,localPort=36480] 
08-07 15:15:25.976: I/global(29125): I/O error closing connection 
08-07 15:15:25.976: I/global(29125): java.net.SocketException: Socket is closed 
08-07 15:15:25.976: I/global(29125): at java.net.Socket.checkOpenAndCreate(Socket.java:671) 
08-07 15:15:25.976: I/global(29125): at java.net.Socket.getSoLinger(Socket.java:434) 
08-07 15:15:25.976: I/global(29125): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImplWrapper.getSoLinger(OpenSSLSocketImplWrapper.java:156) 
08-07 15:15:25.976: I/global(29125): at org.apache.http.impl.conn.tsccm.AbstractConnPool.closeConnection(AbstractConnPool.java:327) 
08-07 15:15:25.976: I/global(29125): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.deleteEntry(ConnPoolByRoute.java:530) 
08-07 15:15:25.976: I/global(29125): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.deleteClosedConnections(ConnPoolByRoute.java:653) 
08-07 15:15:25.976: I/global(29125): at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.closeExpiredConnections(ThreadSafeClientConnManager.java:301) 
08-07 15:15:25.976: I/global(29125): at com.dropbox.client2.session.AbstractSession$IdleConnectionCloserThread.run(AbstractSession.java:530) 
08-07 15:15:25.996: W/IdleConnectionHandler(29125): Removing a connection that never existed! 
08-07 15:15:26.116: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:26.687: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:27.197: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:27.758: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:28.258: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:29.019: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:29.430: V/mp3dropboxsync(29125): SongDownload 
08-07 15:15:29.700: V/mp3dropboxsync(29125): DoinBackground 
08-07 15:15:32.272: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:32.773: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:33.283: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:33.784: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:34.304: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:34.835: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:35.345: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:35.866: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:36.466: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:36.967: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:37.487: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:38.068: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:38.569: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:39.079: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:39.580: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:40.150: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:40.751: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:41.311: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:41.822: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:42.402: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:42.903: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:43.453: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:43.954: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:44.464: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:44.985: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:45.485: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:45.996: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:46.496: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:47.007: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:47.567: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:48.258: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:48.839: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:49.439: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:49.990: V/mp3dropboxsync(29125): onProgress 
08-07 15:15:50.210: V/mp3dropboxsync(29125): SongDownload 
08-07 15:15:50.240: V/mp3dropboxsync(29125): DoinBackground //file already exist 

나는 모든 것을 시도했다. DoinBackground가 끝난 후에도 onProgressUpdate와 같은 여러 가지 효과가 여러 번 호출되었습니다. 그러나 그 순간에 전화를받지 못했습니다. 또한 소켓 닫기 예외를 설명 할 수 없습니다. =/

희망을 보내 주시면 감사하겠습니다. 이미 전체 프로젝트를 다시 만들고 다시 설치하려고했습니다. 그러나 그것은 효과가 없었습니다.

감사합니다.

+0

는'publishProgress'는 주 응용 프로그램 스레드에 메시지를 보낸다는'handleMessage' 재정이'onProgressUpdate'를 호출, 나는 당신이이 주 응용 프로그램 스레드가 아닌 다른 스레드에서 메서드를 실행 호출하는 것 같아요 , 스레드가 메인 애플리케이션 스레드를 차단하고 있으며, 마지막으로 차단 해제되면 'onProgressUpdate'에 대한 보류중인 호출이 처리됩니다. [this] (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java)를 확인하고,'private static class InternalHandler extends Handler'를 찾아보십시오. 메세지 루퍼는'Looper.getMainLooper()' –

답변

0

내 POC를 사용해보십시오. 도움이됩니다.

public class MainActivity extends Activity { 처리기 처리기 = 새 처리기();

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    new BackGroundTask().execute(""); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

class BackGroundTask extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 

     Thread t = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       for (int i = 0; i < 10; i++) { 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        publishProgress("" + i); 
       } 
      } 
     }); 
     t.start(); 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
     TextView textView = (TextView) findViewById(R.id.textView); 
     textView.setText("T:" + values[0]); 
    } 

    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 

    } 
} 

}

+0

입니다. IntentService에서 asynctask를 호출했기 때문일 수 있습니다. – Stefan

+1

@Stefan AsyncTask는 메인 UI 작업에서만 호출되기 때문에 질문의 intentservice에서 호출한다고 언급해야합니다. –

+0

이제 정상적인 서비스로 변경했습니다. 그러나 이제 OnProgressUpdate는 doInBackground 다음에 여러 번 호출됩니다. publishProgress가 호출 될 때마다 호출해야합니까? – Stefan