异步任务的进度对话框

Progress Dialog on Async Task

我创建了三个 Classes,即 Mainactivity,它正在将上下文传递给服务器 class,扩展到 Asynctask。有一个 class 命名设置,它调用服务器 class 来更新服务器中的数据。

用于传递上下文的 Mainactivity 代码:

Server.setActivityContext(getApplicationContext());

服务器代码 Class:

public class Server extends AsyncTask<Void, Void, Void> {


static Context mycontext;

public static void setActivityContext(Context receivingcontext) {
    mycontext = receivingcontext;
}

Dialog dialog;

@Override
protected void onPreExecute() {
    super.onPreExecute();
    dialog = ProgressDialog.show(mycontext, "Updating ..", "Please wait......");
}

@Override
protected Void doInBackground(Void... params) {
//Background task       
        return null;

}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    dialog.dismiss();
}
}

我在调用此服务器 class 时在 progressdialog 上收到错误消息。尽管传递了上下文,但您可以提出任何修复建议。

错误:

 FATAL EXCEPTION: main

    Process: jss.smartapp, PID: 22915 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

您有方法 setActivityContext 并发回 activity 上下文,而不是应用程序上下文

不要使用静态方法。使用适当的构造函数。

public class ServerTask extends AsyncTask<Void, Void, Void> {

    private Context mycontext;

    public ServerTask(Context c) {
        this.mycontext = c;
    } 

调用它
new ServerTask(MainActivity.this).execute();

您可以像这样创建用于传递上下文的构造函数

public class Server extends AsyncTask<Void, Void, Void> {

private static final String TAG = "Server";
private Context mContext;

public Server(Context context){
    mContext = context;
}



Dialog dialog;

@Override
protected void onPreExecute() {
    super.onPreExecute();
    Log.d(TAG, "onPreExecute:called ");
    dialog = ProgressDialog.show(mContext, "Updating ..", "Please 
   wait......");
}

      @Override
      protected Void doInBackground(Void... params) {
      //Background task
       Log.d(TAG, "doInBackground: called");
       return null;

       }

   @Override
   protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    Log.d(TAG, "onPostExecute: called");
    dialog.dismiss();
   }
}

并像这样调用此服务器 class

 new Server(MainActivity.class).execute();