【问题标题】:getWindow() cannot resolve inside AsyncTaskgetWindow() 无法在 AsyncTask 内部解析
【发布时间】:2016-03-29 03:20:50
【问题描述】:

我正在尝试在AsyncTask 内部实现一些东西,例如this

@Override
protected void onPreExecute() {
    super.onPreExecute();
    ...
    // prevent screen sleep
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}


@Override
protected void onPostExecute(List<Result> results) {
    super.onPostExecute(results);
    getWindow().clearFlag (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    ...
}

但我在 Android Studio 中收到错误“Cannot resolve method getWindow()”。我错过了什么?

更新

我的 AsyncTask 的构造函数是:

public MyTask(ProgressDialog pDlg) {
    progressDlgReference = new WeakReference<>(pDlg);
    progressDlg = progressDlgReference.get();
    context = progressDlg.getContext();
    ...
}

我尝试将context 转换为Activity,但((Activity) context).getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 出现运行时错误?

【问题讨论】:

  • runOnUIThread() 尝试使用它
  • @ArmasCyndromic 没有理由将runOnUiThread()AsyncTask 一起使用,因为它已经提供了在主Thread 上运行代码的方法
  • @codeMagic true 有一些方法用于在主线程上运行代码。我相信 runOnUiThread() 是可以访问主线程的方法,甚至可以根据需要形成一些后台任务,例如异步任务中的 doInBackground()。
  • @ArmasCyndromic 是的,但我已经看到它给人们带来了太多问题,这是不必要的,因为创建 AsyncTask 是为了解决这些问题。如果您需要在任务完成之前从 doInBackground() 更新 UI,那么当您可以简单地调用 publishProgress() 时,没有理由使用该代码引入更复杂并且可能引入更多错误。如果任务完成,那么显然会调用onPostExecute() 来更新UI。

标签: android android-studio android-asynctask


【解决方案1】:

你可以看到from the docsgetWindow()Activity的一个方法。而且,由于您不在Activity 中,因此该方法不可用。

所以你需要引用Activity 来识别这个方法。

现在,我看不到您的大部分代码,但您可以从 Activity 传递 Context 并将其转换为引用该方法。

所以你会 pass the Context like this 然后将其转换为 Activity

This SO answer应该会给你更多帮助

【讨论】:

  • 谢谢,我尝试在AsyncTask context = progressDlg.getContext(); 中将context 转换为onPreExecuteonPostExecute,但出现运行时错误。
  • @TRX 你没有将Context 传递给你的AsyncTask 所以我想你的Context 变量是nullSee this answer 将其传递给您的任务构造函数。
【解决方案2】:

getWindow() 是您的Activity 提供的一种方法。

这将通过 ff 提供给您:

  • 如果您的AsyncTask 在您的Activity 之内/之内。
  • getActivity().getWindow()

【讨论】:

  • 我的AsyncTask不在Activity里面,而是一个单独的类,调用者是Fragment
  • 您可以通过不同的方式实现这一目标。例如,您可以按照@codeMagic 将您的Activity 传递给您的AsyncTask,然后您可以从那里调用yourActivity.getWindow()。请记住,getWindow() 方法只能通过您的 Activity 或您引用 Activity 的方式访问。
【解决方案3】:

试试:

yourActivity.this.getWindow().clearFlag (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

这是一个可以为您提供更多帮助的参考: link

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多