【问题标题】:What is the context in Async task异步任务中的上下文是什么
【发布时间】:2013-05-15 13:30:22
【问题描述】:

我正在 android 中运行 Async(doInBackground) 任务。

我需要为任务填充进度条。所以我在 onPreExecute 中显示了一个 progressDialog,

ProgressDialog.show 的签名是 Show(Context,Title,message)

但是这里的上下文是什么?

 @Override
protected void onPreExecute() 
{
    progress = ProgressDialog.show(???, "Loading", "Please Wait");
}

【问题讨论】:

  • 只需初始化 Context context=this;在 onCreate() 方法中。它仅包含当前活动
  • 粘贴有帮助的代码,在哪里定义异步任务?

标签: android android-asynctask


【解决方案1】:

为您的 AsyncTask 创建一个将上下文作为参数的构造函数。

public class async extends AsyncTask<String, Integer, String>{

    private Context context;

    public async(Context context) {
      this.context = context;
     }


    @Override
    protected void onPreExecute() {
     // Manipulate progress bar      
    }

然后使用它来执行它

async mTask = new async(context).execute(params);

【讨论】:

    【解决方案2】:

    Context 只能是 Activity 、Service 或 Brodcast 不能属于任何其他类,如 Asyncktask。因此,请将 Activity 的 Context 放在您使用该 AsyncTask 类的位置。

    【讨论】:

      【解决方案3】:

      您可以在 AsyncTask 构造函数中传递活动上下文来创建 ProgressDialog :

      MyAsyncTask 构造函数:

      public MyAsyncTask(Context context){
           progressDialog = new ProgressDialog(context, "Loading", "Please wait...");
      }
      

      onPreExecute 方法:

      @Override
      protected void onPreExecute() 
      {
          progressDialog.show();
      }
      

      或存储上下文并在 onPreExecute 方法中创建对话框(但我更喜欢使用第一种方式):

      public class MyAsyncTask extends AsyncTask{
           private Context mContext;
      
           public MyAsyncTask(Context context){
                this.mContext = context; 
           }
      
           @Override
           protected void onPreExecute() 
           {
                progress = ProgressDialog.show(this.mContext, "Loading", "Please Wait");
           }
      }
      

      并且在声明 MyAsyncTask 的活动中,你传递了活动:

      MyAsyncTask asyncTask = new AsyncTask(this);
      asynchTask.execute();
      

      【讨论】:

        【解决方案4】:
        Add this function in your class
        
           private Context getDialogContext() {
            Context context;
            if (getParent() != null)
                context = getParent();
            else
                context = this;
            return context;
        }
        
        In your asynctask use it as follows
        
          @Override
          protected void onPreExecute() 
          {
            progress = ProgressDialog.show(getDialogContext(), "Loading", "Please Wait");
            }
        

        【讨论】:

          【解决方案5】:

          如果你只想使用this 作为上下文,那么你的 Asynctask 应该被写成一个扩展 Activity 类的类的内部类。然后你的上下文是扩展 Activity 的类的名称。像这样传递上下文仍然是更好的做法:

          ClassExtendingActivity.this
          

          【讨论】:

            【解决方案6】:

            您可以传递当前活动视图参考,例如MainActivity.this

            【讨论】:

            • 缺少“如何”将其传递给 AsyncTask 的部分,默认情况下它没有。您必须自己创建它。
            • 对不起,我无法理解如何通过 meance??
            • 我的意思是,AsyncTask如何获取MainActivity.this的引用。如果它在单独的文件中,它将不起作用。您应该通过函数或构造函数为它提供上下文,请参阅 Kuffs 答案。
            • 你说得对,我就是这么想的,但我得到了负利率,然后我停下来思考。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多