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()内のダイアログウィンドウを閉じて、プログレスバーを表示することは可能ですか?
たぶん私は不明な点があったかもしれません。私はプログレスバーを表示しようとしましたが、asynctaskがonPostExecute()に達するまでインテントが作成したファイルダイアログウィンドウが開いているので、onPreExecuteとdoInBackground()の間はプログレスバーが表示されません。面白いのは、progressbar.isShowing()がtrueを返すということです。 – user1086500
あなたは何を意味するのかよくわかりません。通常は 'startActivityForResult()'でオープンされているアクティビティは 'onActivityResult'が実行される直前に閉じられます – injecteer
私はこれをエミュレータAPI 23とアンドロイド6のsamsung s6で試しました。私はThread.sleepを内部に入れましたonActivityResult()で呼び出されたasynctask内のdoInBackground()と、このスリープ中に選択するファイルのダイアログが表示されます。 onAcitivtyResult()が終了した後、アクティビティ/インテントが閉じられたようです... – user1086500