回転するProgressDialogを使用して、プログラムが動作していることをユーザーに通知しようとしています。をProgressDialog
正しく表示および却下するようになりましたが、呼び出しの間に単純なコードがある場合に限ります。ProgressDialog
現在、メソッド内で初期化を行っonCreate
ています。ボタンを押すと、ダイアログが表示され、多くのコードがトラバースされ、その後にdismiss呼び出しが続きます。コードはすべて正しく実行されますが、ダイアログは表示されません。
public class Waves extends Activity {
private ProgressDialog pd;
public void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
pd = new ProgressDialog( this );
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("Reading...");
pd.setCancelable(false);
setContentView( R.layout.waves );
readButton = (Button) findViewById( R.id.readButton );
readButton.setOnClickListener( new OnClickListener() {
public void onClick(View arg0) {
pd.show( );
if( myService.getState() != 3 ) {
myService.setHandler( mHandler );
myService.connect( MainMenu.previousDevice, true );
} else {
readWaves();
}
}
});
}
readWavesを以下に示します。readWavesの最後にpd.dismiss()
が呼び出されます。readWaves内からの関数呼び出しがたくさんありますが、長くなりすぎないように表示しようと思います。
private void readWaves() {
if( spinnerChoice == 0 ) {
Log.i( "IN IF", "IN IF" );
// Diff Voltage
waveResults = RelayAPIModel.NativeCalls.GetWavesJava( RelayAPIModel.WAVES_V );
} else {
// Current
waveResults = RelayAPIModel.NativeCalls.GetWavesJava( RelayAPIModel.WAVES_I );
}
updateGraph();
netV1Check.setChecked( true );
netV2Check.setChecked( true );
netV3Check.setChecked( true );
vdi1Check.setChecked( true );
vdi2Check.setChecked( true );
vdi3Check.setChecked( true );
hasRead = true;
pd.dismiss();
}
呼び出しはupdateGraph()
グラフに単純な化粧品を行うので、問題はないと思います。呼び出しは、RelayAPIModel.NativeCalls.GetWavesJava()
私が問題が発生すると思うところです。
GetWavesJava()
私のネイティブライブラリにあるCで書かれた関数です。GetWavesJava()内から、他のネイティブC関数への多数の関数呼び出しと、アプリケーションのJavaエンドへの多数の関数呼び出しがあります。
これはばかげているように聞こえますが、その理由は、Cのネイティブライブラリが使用する必要のある既存のライブラリであるためです。ただし、AndroidのBluetooth機能はサポートされていないため、Bluetoothを介してデータを送受信するすべてのメソッドをJava側で記述する必要があります。
I / Oストリームに使用されるJava関数は全部で6つあり、これらは、この1回の呼び出しだけでなく、アプリケーション全体で何度も使用されます。それらの関数の1つを入れることを検討pd.dismiss()
しましたが、それらの関数が呼び出される時間の1%程度で十分です。
ネイティブ関数呼び出しの前にダイアログが表示され、その後停止するようにするための解決策を知っている人はいますか?
これは似たようなSOの質問ですが、まったく同じではありません
編集 :
以下の答えを使用して、これは私のコードです:
readButton = (Button) findViewById( R.id.readButton );
readButton.setOnClickListener( new OnClickListener() {
public void onClick(View arg0) {
pd.show( );
Thread export = new Thread() {
public void run() {
if( myService.getState() != 3 ) {
Log.i( "myService", "12222" );
myService.setHandler( mHandler );
myService.connect( MainMenu.previousDevice, true );
} else {
Log.i("myService", "32222" );
readWaves();
Log.i( "myService", "42222" );
}
mHandler.obtainMessage(MainMenu.READ_FINISHED );
}
};
export.start();
}
});
Log( 42222 )
に到達することはありません。スピナーは表示されますが、プログラムがクラッシュし、数秒で再起動します。行に追加.sendToTarget()
しましたmHandler.obtainMessage()
が、これによりスピナーが表示されず、プログラムがクラッシュします。
編集2:
readWaves
また、この関数は既存の実行中のスレッドを使用して実行することを追加したいと思います。それが何か違いを生むかどうかはわかりません
編集3:
ここでは、最初の送信から2番目のコードブロックを更新しました。このコードを使用すると、進行状況ダイアログが表示されることはありません。コードは、を含むすべてのコードProgressDialog
がまったく存在しなかったために実行されます。
private void readWaves() {
if( spinnerChoice == 0 ) {
Log.i( "IN IF", "IN IF" );
// Diff Voltage
waveResults = RelayAPIModel.NativeCalls.GetWavesJava( RelayAPIModel.WAVES_V );
} else {
// Current
waveResults = RelayAPIModel.NativeCalls.GetWavesJava( RelayAPIModel.WAVES_I );
}
pd.dismiss();
updateGraph();
netV1Check.setChecked( true );
netV2Check.setChecked( true );
netV3Check.setChecked( true );
vdi1Check.setChecked( true );
vdi2Check.setChecked( true );
vdi3Check.setChecked( true );
hasRead = true;
}
編集4:
これは私の最新のコードです。ProgressDialogは必要な場所に表示されますが、スピナーは回転しません。置き換えpd.dismiss()
て後でコードpd.hide()
に入れようとpd.dismiss()
しましたが、これによりダイアログが常に画面に表示されたままになります。そして、.setCancelable(false)
使用されているので、私はそれを元に戻すことはできません。内に引数をpd
渡すことができないため、onClickListenerの外の宣言も取得しました。私はそれを機能させるために何を渡すことができるかを覚えていません、私は試しました、しかしそれらのどれも機能しませんでした。this
ProgressDialog
OnClickListener
getApplicationContext()
ClassName.java
ClassName.class
readButton = (Button) findViewById( R.id.readButton );
final ProgressDialog pd = new ProgressDialog( this );
readButton.setOnClickListener( new OnClickListener() {
public void onClick(View arg0) {
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("Reading...");
pd.setCancelable(false);
pd.show( );
Thread export = new Thread() {
public void run() {
if( myService.getState() != 3 ) {
Log.i( "myService", "12222" );
myService.setHandler( mHandler );
myService.connect( MainMenu.previousDevice, true );
} else {
runOnUiThread(new Runnable() {
public void run() {
readWaves();
}
});
}
mHandler.obtainMessage(MainMenu.READ_FINISHED ).sendToTarget();
pd.dismiss();
}
};
export.start();
編集5:if
スピナーをステートメントに表示させようとしています:
readButton = (Button) findViewById( R.id.readButton );
readButton.setOnClickListener( new OnClickListener() {
public void onClick(View arg0) {
final ProgressDialog pd = new ProgressDialog( Waves.this );
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("Reading...");
pd.setCancelable(false);
pd.show( );
Thread export = new Thread() {
public void run() {
if( myService.getState() != 3 ) {
Log.i( "myService", "12222" );
myService.setHandler( mHandler );
runOnUiThread( new Runnable() {
public void run() {
myService.connect( MainMenu.previousDevice, true );
}
});
} else {
runOnUiThread(new Runnable() {
public void run() {
readWaves();
}
});
}
mHandler.obtainMessage(MainMenu.READ_FINISHED ).sendToTarget();
pd.dismiss();
}
};
export.start();