【问题标题】:Progress Dialog on Async Task异步任务的进度对话框
【发布时间】:2017-05-10 08:33:25
【问题描述】:

我创建了三个类,即 Mainactivity,它将上下文传递给服务器类,扩展至Asynctask。有一个名为setting的类,调用server类来更新server中的数据。

传递上下文的Mainactivity代码:

Server.setActivityContext(getApplicationContext());

服务器类代码:

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();
}
}

调用此服务器类时,progressdialog 出现错误。虽然传递了上下文,但您可以建议的任何修复。

错误:

 FATAL EXCEPTION: main

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

【问题讨论】:

  • 发布您的 logcat 错误
  • 在方法 setActivityContext (MainActivity.this) 中将 this 作为上下文传递
  • Server.setActivityContext(MainActivity.this);//传递你的活动上下文你必须传递活动上下文而不是应用程序上下文..

标签: java android android-asynctask progressdialog


【解决方案1】:

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

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

    private Context mycontext;

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以创建一个构造函数来传递这样的上下文

      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();
         }
      }
      

      并像这样调用这个服务器类

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多