1

私はいくつかの制御を持っているので、いくつかのスレッドを実行しました.asycntaskを使用して、ある画面から別の画面への読み込みバーを表示したい.しばらくすると、セカンドスクリーンになります。実行後が正しく機能していないと思います。誰か助けてくれますか?

これは私のコードです:

private class ProgressBarAsync extends AsyncTask<Void, Integer, Void>{

        /** This callback method is invoked, before starting the background process */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            /** Creating a progress dialog window */
            mProgressDialog = new ProgressDialog(Login.this);

            /** Close the dialog window on pressing back button */
            mProgressDialog.setCancelable(true);

            /** Setting a horizontal style progress bar */
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

            /** Setting a message for this progress dialog
             * Use the method setTitle(), for setting a title
             * for the dialog window
             *  */
            mProgressDialog = ProgressDialog.show(Login.this, 
                    "Giriş yapıyorsunuz", "Lütfen bekleyin...");



        }

        /** This callback method is invoked on calling execute() method
         * on an instance of this class */
        @Override
        protected Void doInBackground(Void...params) {

            try {
                startMyApplication() ;
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

        /** This callback method is invoked when publishProgress()
         * method is called */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            mProgressDialog.setProgress(mProgressStatus);
        }

        /** This callback method is invoked when the background function
         * doInBackground() is executed completely */
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            if (mid > 0) {
                Intent btn_login = new Intent(
                        getApplicationContext(), MainScreen.class);
                startActivity(btn_login);
            }
            else {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(Login.this);

                // Setting Dialog Title
                alertDialog.setTitle("GİRİŞ");

                // Setting Dialog Message
                alertDialog.setMessage("Kullanıcı adı veya Parola Hatalı Lütfen tekrar deneyin.");

                // Setting Icon to Dialog
                //alertDialog.setIcon(R.drawable.delete);

                // Setting Negative "NO" Button
                alertDialog.setNegativeButton("TAMAM", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {

                        dialog.cancel();
                    }
                });

                // Showing Alert Message
                alertDialog.show();         
            }

            //run();                    
            mProgressDialog.dismiss();

これは startmyapp スレッドです:

public void startMyApplication() throws InterruptedException {

    ExecutorService executor = Executors.newFixedThreadPool(2);
    FutureTask<String> futureOne = new FutureTask<String>(
            new Callable<String>() {
                public String call() throws Exception {
                    if (isOnline()) {
                        // Call Login Web Service with username and password and get mid
                        mid = callLoginWS(username.getText().toString(), password.getText().toString());                            
                        if (mid > 0) {
                            //callPasswordGeneratorWS(mid);
                            // Insert mid and username into sqllite
                            dbInstance.insertMerch(mid,username.getText().toString());
                        }
                        Log.i("futureone", "futureone");

                    }
                    return "TEST";  
                }
            });

    FutureTask<String> futureTwo = new FutureTask<String>(
            new Callable<String>() {
                public String call() throws Exception {
                    // Get mid from database
                    mid = dbInstance.selectMerch(username.getText().toString());
                    return "TEST";
                }

            });



    // ... Dispatch
    // Check if user exists previously
    // ... Dispatch     
    mid = dbInstance.selectMerch(username.getText().toString());
    dbInstance.close();


    executor.execute(futureOne);
    while (!(futureOne.isDone())) {
        executor.execute(futureTwo);
    }
    Log.i("login","new login");
    //}
    executor.shutdown();
}
4

3 に答える 3

0

まず、ExecutorServiceを使用せずにstartMyApplicationメソッドを実行してみてください。doInBackgroundでコードを実行すると、すでに別のスレッドにいるので(間違っている場合は修正してください)、余分なスレッドを使用せずにコードを実行します。これを実行して、すべてが機能しているかどうかを確認します。 また、 doInBackgroundメソッドのどこでもpublishProgress(Progress ... values)メソッドを呼び出さないことに気づきました。そのため、プログレスバーに適切な値を公開することはできません。

于 2012-12-12T11:24:28.563 に答える
0

私が間違っていなければ。AsyncTask を使用して既に startMyApplication() を非同期で実行しているため、FutureTask を作成する理由は何ですか。すでにバックグラウンド タスクに入っています。(mid が長いことを考慮して) このように ur コードを変更してみてください。

    public Long startMyApplication(){
       if (isOnline()) {
          // Call Login Web Service with username and password and get mid
          mid = callLoginWS(username.getText().toString(), password.getText().toString());                            
          if (mid > 0) {
                //callPasswordGeneratorWS(mid);
                // Insert mid and username into sqllite
                dbInstance.insertMerch(mid,username.getText().toString());
          }
          Log.i("futureone", "futureone");

          }
      mid = dbInstance.selectMerch(username.getText().toString()); //OR directly returning mid without fetching from db as it will be same.
      return mid;
    }

今は doInBackground です。

@Override
protected Long doInBackground(Void...params) {
            Long temp = -1l;
            try {
                temp = startMyApplication() ;
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return temp;
 }

@Override
protected void onPostExecute(Long mid) {
mProgressDialog.dismiss(); //First dismiss the progress bar.
//Rest of ur code will go same in this. Remember mid is now accessible correctly.
}

次の行を変更します。

private class ProgressBarAsync extends AsyncTask<Void, Integer, Void>

private class ProgressBarAsync extends AsyncTask<Void, Integer, Long>

私が理解している限り、これはあなたのために働くかもしれません。

于 2012-12-13T10:18:58.503 に答える