2016-11-29 19 views
1

Intent.ACTION_GET_CONTENTでインテントを使用してXMLファイルを選択しています。 onActivityResult()内で、このXMLファイルをデータベースに読み込むasynctaskを起動します。onActivityResult()内でAsynctaskを起動する

asynctaskにエラー処理と予想されるUIの変更のためにアプリケーションが進む前にプログレスバーが表示されるようにしたいと思います。

asynctaskが実行されている限り、インテントが作成する選択ダイアログが表示されます。つまり、アプリケーションはまだonActivityResult()ブロックにあり、進行状況ダイアログは表示されません。 onActivityResult()が終了すると、onPostExecute()が呼び出されます。

私もに.get使用することを試みた()アプリを進める前に、asynctask仕上げを行いますが、運と...

私はそれは私の一部に間違ったロジックに沸くと思います...

importDBがそれ自身のクラスであることを除いて、1つのアクティビティですべてが起こっています。

意図がstartetである。この方法は...

intent = new Intent(Intent.ACTION_GET_CONTENT); 
intent.addCategory(Intent.CATEGORY_OPENABLE); 
intent.setType("text/xml"); 
startActivityForResult(Intent.createChooser(intent, "Select XML"), RC_IMPORT_FILE); 

...とonActivityResult()が

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (resultCode) { 
     case Activity.RESULT_OK: 
      switch (requestCode) { 
       case RC_IMPORT_FILE: 
        Uri uri = data.getData(); 
        if (data != null) { 
         importDB(new File(uri.toString()), uri, false); 
        }; 
       break; 
     ... more switch statements... 
    } 
} 

...このようになります...とimportDBは次のようになります。 ..

private void importDB(File file, Uri uri, boolean xmlRaw, Context context) { 
    int error = 0; 

    ImportDataBase importDataBase = new ImportDataBase(); 
    importDataBase.setContext(this); 
    importDataBase.setUri(uri); 
    importDataBase.xmlRaw(xmlRaw); 
    try { 
     importDataBase.execute("ImportDB").get(); 
    } catch (ExecutionException ee) { 
     logException(TAG, "importDB", ee); 
     error = 1; 
    } catch (InterruptedException ie) { 
     logException(TAG, "importDB", ie); 
     error = 2; 
    } 
} 

...と非同期タスク(ImportDataBase)は次のようになります...

import android.app.ProgressDialog; 
import android.content.Context; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.widget.Toast; 
import java.io.InputStream; 

public class ImportDataBase extends AsyncTask<String, Integer, String> { 

private static final String TAG = "ImportDataBase"; 

private Context context; 
private ProgressDialog progressDialog; 

private Uri uri = null; 
private InputStream xmlStream = null; 

private XMLParser xmlParser; 
private boolean xmlRaw = true; 
private int errorCode = 0; 

public void xmlRaw(boolean xmlRaw) { 
    this.xmlRaw = xmlRaw; 
} 

public void setUri(Uri uri) { this.uri = uri; } 
public void setInputStream(InputStream inputStream) { this.xmlStream = inputStream; } 
public void setContext(Context context) { 
    this.context = context; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    progressDialog = this.context; 
    progressDialog.setCancelable(false); 
    progressDialog.setMessage("Please wait..."); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progressDialog.show(); 
    xmlParser = new XMLParser(); 
    xmlParser.xmlRaw(xmlRaw); 
} 

@Override 
protected String doInBackground(String... params) { 
    String result = "0"; 
    int error = 0; 
    InputStream inputStream = null; 
    try { 
     if (uri != null) inputStream = context.getContentResolver().openInputStream(uri); 
      else inputStream = this.xmlStream; 
    } catch (Exception e) { 
     result = "1000"; 
    } 

    if (error == 0) { 
     try { 
      xmlParser.readXML(inputStream); 
     } catch (NullPointerException npe) { 
       result ="10"; 
     } catch (Exception e) { 
       result ="10"; 
     } 

    } else result = "31"; 

    switch (xmlParser.getError()) { 
     case 1 : result = "10"; break; // XML Parser error 
     case 2 : result = "15"; break; // URLERROR; 
     case 3 : result = "30"; break; // IOFileError 
     case 4 : result = "31"; break; // FileError; 
     case 5 : result = "32"; break; // FileDoesNotExists; 
     default : result = "0"; 
    } 

    try { 
     inputStream.close(); 
    } catch (Exception e) { 
    } 
    return result; 
} 

@Override 
protected void onPostExecute(String string) { 
    super.onPostExecute(string); 
    String error = ""; 
    if (Integer.valueOf(string) > 0) { 
     switch (Integer.valueOf(string)) { 
      case 1: 
       error = "You need to update the app to the newest version!"; 
       errorCode =1; 
      break; 
      case 10 : 
       error = "XML parser error! Wrong file?"; 
       errorCode =10; 
      break; 
      case 15 : 
       error = "Wrong URL!"; 
       errorCode =15; 
      break; 
      case 30 : 
       error = "File read/Write error!"; 
       errorCode =30; 
       break; 
      case 31 : 
       error = "File error"; 
       errorCode =31; 
       break; 
      case 32 : 
       error = "File does not exsits!"; 
       errorCode =32; 
       break; 
      case 99 : 
       error = "Unknwon XML parser error!"; 
       errorCode =99; 
       break; 
      case 100: 
       error = "Database error! Retry or reinstall app!"; 
       errorCode =100; 
      break; 
      case 1000: 
       error = "Unknown error!"; 
       errorCode =1000; 
      break; 
      default: 
       error = "Unknwon error!"; 
     } 
     Toast.makeText(context, error, Toast.LENGTH_SHORT).show(); 
    } 
    if (progressDialog.isShowing()) progressDialog.dismiss(); 
} 

public int getError() { 
    return this.errorCode; 
} 

@Override 
protected void onCancelled() { 
    super.onCancelled(); 
} 
} 

どのように私は、アプリケーションを終了するasynctaskを待つことができますか? importDB()を呼び出す前にonActivityResult()内のダイアログウィンドウを閉じて、プログレスバーを表示することは可能ですか?

答えて

0

基本的にはとなるべくをブロックする必要があります。私は、開始時にProgressDialogを表示し、終了時に、それを隠してAsyncTaskを使用します。

private ProgressDialog progressDialog; 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // blahblah 
        if (data != null) { 
         new ImportTask(new File(uri.toString()), uri).execute(); 
        } 
    // blahblah 
} 

class ImportTask extends AsyncTask<Void, Void, Void> { 
    private File file; 
    private Uri uri; 

    ImportTask(File file, Uri uri){ 
    this.file = file; 
    this.uri = uri; 
    } 

    @Override 
    protected void onPreExecute() { 
    progressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... voids) { 
    importDB(file, uri, false); 
    return null; 
    } 

    @Override 
    protected void onPostExecute(Void res) { 
    progressDialog.hide(); 
    }  
} 

あなたはimportDB()中に並行して他のものを行うことを決定することができる。この方法が実行されています。

+0

たぶん私は不明な点があったかもしれません。私はプログレスバーを表示しようとしましたが、asynctaskがonPostExecute()に達するまでインテントが作成したファイルダイアログウィンドウが開いているので、onPreExecuteとdoInBackground()の間はプログレスバーが表示されません。面白いのは、progressbar.isShowing()がtrueを返すということです。 – user1086500

+0

あなたは何を意味するのかよくわかりません。通常は 'startActivityForResult()'でオープンされているアクティビティは 'onActivityResult'が実行される直前に閉じられます – injecteer

+0

私はこれをエミュレータAPI 23とアンドロイド6のsamsung s6で試しました。私はThread.sleepを内部に入れましたonActivityResult()で呼び出されたasynctask内のdoInBackground()と、このスリープ中に選択するファイルのダイアログが表示されます。 onAcitivtyResult()が終了した後、アクティビティ/インテントが閉じられたようです... – user1086500

関連する問題