-2

ProgressDialog を使用しようとしています。アプリを実行すると、進行状況ダイアログ ボックスが表示され、1 秒後に消えます。プロセスの完了時に表示したい..これが私のコードです:

public class MainActivity extends Activity {
android.view.View.OnClickListener mSearchListenerListener;
 private ProgressDialog dialog;

  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      new YourCustomAsyncTask().execute(new String[] {null, null});

      }



  private class YourCustomAsyncTask extends AsyncTask <String, Void, Void> { 

        protected void onPreExecute() { 
           dialog = new ProgressDialog(MainActivity.this); 
           dialog.setMessage("Loading...."); 
           dialog.setIndeterminate(true); 
           dialog.setCancelable(true); 
           dialog.show(); //Maybe you should call it in ruinOnUIThread in doInBackGround as suggested from a previous answer
        } 

        protected void doInBackground(String strings) { 
           try { 

            //  search(strings[0], string[1]);

              runOnUiThread(new Runnable() { 
                 public void run() { 
                  //  updateMapWithResult(); //Or call it onPostExecute before progressDialog's dismiss. I believe this method updates the UI so it should run on UI thread
                 } 
               }); 

           } catch(Exception e) {
           }


        }

    @Override 
    protected void onPostExecute(Void params) { 
        dialog.dismiss(); 
        //result 

    }

    @Override
    protected Void doInBackground(String... params) {
        // TODO Auto-generated method stub
        return null;
    } 

}
}

更新された質問:

        @Override
    public void onCreate(SQLiteDatabase db) {
        mDatabase = db;





          Log.i("PATH",""+mDatabase.getPath());



        mDatabase.execSQL(FTS_TABLE_CREATE);





        loadDictionary();
    }

    /**
     * Starts a thread to load the database table with words
     */
    private void loadDictionary() {
        new Thread(new Runnable() {
            public void run() {
                try {
                    loadWords();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();
    }

    private void loadWords() throws IOException {
        Log.d(TAG, "Loading words...");


        for(int i=0;i<=25;i++)

            {  //***// 


        final Resources resources = mHelperContext.getResources();
        InputStream inputStream = resources.openRawResource(raw_textFiles[i]);
        //InputStream inputStream = resources.openRawResource(R.raw.definitions);
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        try {





            StringBuilder sb = new StringBuilder();
            while ((word = reader.readLine()) != null)
            {
                sb.append(word);
            //  Log.i("WORD in Parser", ""+word);
            }


            String contents = sb.toString();
            StringTokenizer st = new StringTokenizer(contents, "||");
            while (st.hasMoreElements()) {
                String row = st.nextElement().toString();

                String title = row.substring(0, row.indexOf("$$$"));
                String desc = row.substring(row.indexOf("$$$") + 3);
                // Log.i("Strings in Database",""+title+""+desc);
                long id = addWord(title,desc);

                if (id < 0) {
                  Log.e(TAG, "unable to add word: " + title);
              }
            }

        } finally {
            reader.close();
        }

        }

        Log.d(TAG, "DONE loading words.");
    }

すべての単語がデータベースに入力されるまで、ProgressDialogue ボックスを表示したいと考えています。このコードは、SQLITEHELPER を拡張する内部呼び出しにあります。その内部クラスで ProgressDialogue を使用し、addWords() メソッドをバックグラウンドで実行する方法を教えてください。

4

2 に答える 2

1

あなたはこれを持つことはできません

 runOnUiThread(new Runnable() { 
                 public void run() { 
                  //  updateMapWithResult(); //Or call it onPostExecute before progressDialog's dismiss. I believe this method updates the UI so it should run on UI thread
                 } 
               }); 

あなたのdoInBackground()で。

メイン UI スレッドで他のアクションが実行されている場合、進行状況ダイアログは優先されません。これらは、アクションがバックグラウンドで実行される場合にのみ意図されています。doInBackground 内の runonUIthread は役に立ちません。プログレス ダイアログが数秒間しか表示されないのは、通常の動作です。

于 2013-01-18T07:42:39.653 に答える
1

クラス内に2 つのdoInBackground()メソッドがあります。First から をAsyncTask削除し、アノテーションを持つSecondに移動します。runOnUiThread()doInBackground()doInBackground()@Override

意図的に 2 つのメソッドを記述したのか、誤って記述したのかはわかりませんがdoInBackground()、メソッド間でこのような混乱が生じるのは良くありません。あなたAsyncTaskは最初のものを呼んでおらず、注釈を持つdoInBackground()ものを呼び出します。したがって、すぐに null を返すため、1 秒で破棄されます。doInBackground()@OverrideProgressDialog

于 2013-01-18T07:44:36.883 に答える