异步任务的进度对话框

Posted

技术标签:

【中文标题】异步任务的进度对话框【英文标题】: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);//传递你的活动上下文你必须传递活动上下文而不是应用程序上下文.. 【参考方案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();

【讨论】:

以上是关于异步任务的进度对话框的主要内容,如果未能解决你的问题,请参考以下文章