2016-12-06 12 views
0

ファイルをサーバーにロードしようとしています。そして、私はすべての操作が開始enotherメソッドのために行われる前に待つ必要があります。だから私は同期呼び出しを使用します。そして私は新しいスレッドを開始する前にProgressDialogを表示しようとしますが、すべてのスレッドが終了していない間にUIスレッドが終了しました。新しいスレッドの前にProgressDialogが開始しない

private void uploadImageSync() { 
    final ProgressDialog progressDialog; 
    progressDialog = new ProgressDialog(BarcodActivity.this); 
    progressDialog.setMessage("Load..."); 
    progressDialog.show(); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(ROOT_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    RequestInterface service = retrofit.create(RequestInterface.class); 

    int i=0; 
    while (i++ <= 4) { 
     File f = getOutputMediaFilePath(mCode + "_"+i, true); 
     if(f.exists()){ 
      RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), f); 

      MultipartBody.Part body = MultipartBody.Part.createFormData("file", f.getName(), requestFile); 

      final Call<ResponseBody> resultCall = service.uploadImage(body); 

      Thread t = new Thread(new Runnable() { 
       public void run() { 
        try { 
         resultCall.execute().body(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       }}); 
      t.start(); 
      try { 
       t.join(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    progressDialog.dismiss(); 
} 

答えて

0

UIスレッドがフリーズしている理由は、t.join()を呼び出しているためです。 UI Threadは、新しいThreadが終了するまで待機します。

代わりにAsyncTaskを使用することができます。そのクラスはこのようなタスクのために作成されたものです。ここで

は、あなたが簡単にそこにそれを却下できるようUIスレッド上onPostExecute実行されることをそれとandroid dev guide

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 
protected void onProgressUpdate(Integer... progress) { 
    setProgressPercent(progress[0]); 
} 

protected void onPostExecute(Long result) { 
    showDialog("Downloaded " + result + " bytes"); 
    } 
} 

new DownloadFilesTask().execute(url1, url2, url3); 

ノートの使用方法についての一般的な例です。

0
private class DownloadFileTask extends AsyncTask<Void, Void, Void> { 

    private ProgressDialog progressDialog = null; 
    private WeakReference<Activity> weakReference = null; 

    public DownloadFileTask(Activity activity) { 
     reference = new WeakReference<>(activity); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog = new ProgressDialog(weakReference.get()); 
     progressDialog.setMessage("Load..."); 
     progressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(ROOT_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     RequestInterface service = retrofit.create(RequestInterface.class); 

     int i=0; 
     while (i++ <= 4) { 
      File f = getOutputMediaFilePath(mCode + "_"+i, true); 
      if(f.exists()){ 
       RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), f); 
       MultipartBody.Part body = MultipartBody.Part.createFormData("file", f.getName(), requestFile); 
       final Call<ResponseBody> resultCall = service.uploadImage(body); 
       resultCall.execute().body(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
     if(weakReference != null) 
      weakReference.clear(); 
     weakReference = null; 

     if (progressDialog != null && progressDialog.isShowing()) 
      progressDialog.dismiss(); 
     progressDialog = null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     if(weakReference != null) 
      weakReference.clear(); 
     weakReference = null; 

     if (progressDialog != null && progressDialog.isShowing()) 
      progressDialog.dismiss(); 
     progressDialog = null; 
    } 
} 
関連する問題