Java 需要帮助在后台异步任务中加载数据时在UI中显示弹出对话框吗

Java 需要帮助在后台异步任务中加载数据时在UI中显示弹出对话框吗,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我在异步任务的onPreExecute方法中有一个进度对话框,但在异步任务从数据库获取数据时,它不会立即显示。你能建议一些在点击按钮时立即显示进度对话框的东西吗。。在当前场景中,屏幕在提取数据时冻结。抓取后,它会转到下一个屏幕,但同时不会显示“我的进度”对话框。 下面是异步任务 public class waitAsync extends AsyncTask<String, Void, String> { ResultSet rs=null; private Progr

我在异步任务的onPreExecute方法中有一个进度对话框,但在异步任务从数据库获取数据时,它不会立即显示。你能建议一些在点击按钮时立即显示进度对话框的东西吗。。在当前场景中,屏幕在提取数据时冻结。抓取后,它会转到下一个屏幕,但同时不会显示“我的进度”对话框。 下面是异步任务

public class waitAsync extends AsyncTask<String, Void, String> {
    ResultSet rs=null;
   private ProgressDialog processingDialog;
    static Connection conn=null;
    Statement stmt;
   // waitThread wt= new waitThread();
    @Override
    protected void onPreExecute() {
      //  ProgressDialog processingDialog;
        super.onPreExecute();
        processingDialog = new ProgressDialog(MainActivity.mCon);
        processingDialog.show();
        processingDialog.setContentView(R.layout.activity_wait);
        //processingDialog.setMessage("Loading...");

    }
    @Override
   protected String doInBackground(String... params) {
        try {


            String driver = "net.sourceforge.jtds.jdbc.Driver";
            String ip = "mfb.dfsdfsdf.ap-north-1.rds.amazonaws.com";
            String classs = "net.sourceforge.jtds.jdbc.Driver";
            String db = "MyDatabase";
            String un = "xxxwww";
            String password = "xxxxxx";
            Class.forName(classs);

            String ConnURL = null;
            ConnURL = "jdbc:jtds:sqlserver://" + ip + ";"
                    + "databaseName=" + db + ";user=" + un + ";password="
                    + password + ";";
            conn = DriverManager.getConnection(ConnURL);

            stmt = conn.createStatement(
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            rs=stmt.executeQuery(params[0]);
            int size = 0;


            //conn.close();
            MainActivity.getdata=rs;
            MainActivity.flag=1;
            //Thread.sleep(5000);
        } catch (Exception e)
        {
            Log.w("Error connection", "" + e.getMessage());
        }
        return null;
        }
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        processingDialog.dismiss();
      //  wt.interrupted();


    }



}

通过asynctask中的构造函数将活动上下文传递给异步任务,并改用该上下文。像

     Context mainActivityCtxt;  
     waitAsync(Context ctx) {
         this.mainActivityCtxt = ctx;
     };  

     new waitAsync(mainActivityCtxt).execute(SQL); 

希望这有帮助

异步任务之后不需要这样的循环。它将阻止您的UI线程

while(MainActivity.flag==0) // wrong - blocking main thread
            {
                c++;
            }
您需要在activity中创建一个方法,比如说
onDataAvailable
,并在此方法中 您可以执行任何您想执行的操作,或者转到下一个活动,或者其他操作,然后从
onPostExecute

  @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        processingDialog.dismiss();
      //  call load complete method here


    }
这是您更新的异步任务

public class WaitAsyncTask extends AsyncTask<String, Void, String> {

    private WeakReference<MainActivity> activityRef;

    public WaitAsyncTask(MainActivity activity){
        activityRef = new WeakReference<MainActivity>(activity);
    }

     @Override
     protected void onPreExecute() {
        super.onPreExecute();
        // show dialog
    }
    @Override
    protected String doInBackground(String... params) {
        // do you work in background
        return null;
    }

    @Override
    protected void onPostExecute(String data) {
        super.onPostExecute(data);
        // hide dialog
        if(activityRef.get() != null){
            // call load completed method in activity
            activityRef.get().loadCompleted(data);
        }
    }
} // WaitAsyncTask

在任务中调用的
main活动中。您不需要while循环来等待。这个方法在你的数据被取出之后被调用。

因为你已经用“代码”阻塞了UI线程,而(MaunActudio,FLAG=0){CC++;} <代码>…这段代码使AsyncTask变得无用我还能做什么?你能推荐一下吗?我将不得不等到我的异步任务获取我的数据,因为我将在主活动getdata方法中立即需要该数据。我认为我在异步任务中所做的更改将是E即使我尝试了,也不会产生任何效果@MaharithHi,我以前试过,它给出了一个异常错误“android.util.AndroidRuntimeException:requestFeature()必须在添加内容之前调用”。后来我意识到我必须编写processingDialog.show();在setContentView之前。然后尝试使用setMessage(“某些消息”)而不是setContentView,并至少检查显示的对话框。另外,通过构造函数传递上下文,而不是通过静态引用在显示进度对话框之前。它终于开始工作了。。非常感谢我的朋友mallaudinGlad知道这一点。干杯
public class WaitAsyncTask extends AsyncTask<String, Void, String> {

    private WeakReference<MainActivity> activityRef;

    public WaitAsyncTask(MainActivity activity){
        activityRef = new WeakReference<MainActivity>(activity);
    }

     @Override
     protected void onPreExecute() {
        super.onPreExecute();
        // show dialog
    }
    @Override
    protected String doInBackground(String... params) {
        // do you work in background
        return null;
    }

    @Override
    protected void onPostExecute(String data) {
        super.onPostExecute(data);
        // hide dialog
        if(activityRef.get() != null){
            // call load completed method in activity
            activityRef.get().loadCompleted(data);
        }
    }
} // WaitAsyncTask
  public void loadCompleted(String data){
        // this will be called automatically after fetching data is completed
    }