异步任务的进度对话框

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

【讨论】:

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

使用异步任务制作进度对话框

在异步任务中给出异常的进度对话框[重复]

异步任务的进度对话框

如何关闭带有异步任务的进度对话框并避免“您的活动是不是运行错误?”

尝试连接到服务器时带有异步任务的进度条

我如何在我的异步任务类中使用圆形旋转进度条