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



我在异步任务的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();

    }

}

从main_activity

的异步任务的呼吁
Getdata(String bookid)
{
  String SQL="Select eb.book_name,eb.AuthorID,ma.Name,eb.GenreID_M,eb.GenreID_D,gm.Genre_MN+'- '+gd.Genre_DN as Genre,isnull(eb.pubDate,'') pubDate,isnull(eb.book_Loc,'') book_Loc,n" +
                    " eb.Price,eb.ico_Loc,eb.Descrip from Master_ebook eb inner join Master_Author ma on eb.AuthorID=ma.Author_IDn" +
                    " inner join Master_Genre_M gm on eb.GenreID_M=gm.Genre_MIDn" +
                    "inner join Master_Genre_D gd on eb.GenreID_D= gd.Genre_DID where eb.bookID=" + bookid;

            new waitAsync().execute(SQL);
            int c=0;
            while(MainActivity.flag==0)
            {
                c++;
            }
            if(MainActivity.flag==1)
            {
                MainActivity.flag=0;
                //processingDialog.dismiss();
            }
            ResultSet rs=MainActivity.getdata;
}

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

while(MainActivity.flag==0) // wrong - blocking main thread
            {
                c++;
            }

您需要在活动中创建一种方法,例如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

和在您的MainActivity中,创建一种要接收结果的方法。我已经创建了此方法

  public void loadCompleted(String data){
        // this will be called automatically after fetching data is completed
    }

MainActivity中,我从我的任务中调用。您不需要循环等待。获取数据后将调用此方法。

将活动上下文通过asynctask中的构造函数传递到异步任务,然后使用该上下文。喜欢

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

希望这会有所帮助。

最新更新