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

3

此部分导致延迟。

while (!(futureOne.isDone())) {
        executor.execute(futureTwo);
    }

在这里,您正在阻止当前线程完成。并等待 futureOne完成。

于 2012-12-12T10:19:23.733 回答
0

如果我没记错的话。您已经在使用 AsyncTask 异步执行 startMyApplication() 那么为什么要创建 FutureTask。您已经在后台任务中。(考虑到中间很长)尝试像这样修改你的代码,

    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 回答
0

首先,尝试在没有ExecutorService的情况下执行startMyApplication方法。当您在doInBackground中运行代码时,您已经在另一个线程中(如果我错了,请纠正我),因此请在不使用额外线程的情况下运行您的代码。这样做并检查一切是否正常。 另外,我注意到您没有在 doInBackground 方法的任何地方调用publishProgress ( Progress... values)方法。因此,您无法为进度条发布正确的值。

于 2012-12-12T11:24:28.563 回答