异步任务后使菜单项可见时出现问题



我有一个刷新按钮,我想根据情况使其可见。

单击"刷新"按钮时,我可以毫无问题地使其不可见,但是,一旦AsyncTask过程完成,我将无法使其再次可见。我无法将MenuItem值传递回AsyncTask

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getSupportMenuInflater().inflate(R.menu.refresh_action_provider, menu);        
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
  switch(item.getItemId()) {
  case R.id.menu_refresh:
      item.setVisible(false); //hide refresh button
      setSupportProgressBarIndeterminateVisibility(true);
    Toast.makeText(getApplicationContext(), "REFRESH CLiCKED", Toast.LENGTH_SHORT).show();
    new DownloadNewsTask().execute(); 
    return true;
  }
  return false;
}

您可以在任务的构造函数中传递您的项目,存储它并使它onPostExecute方法中可见:

public class DownloadNewsTask extends AsyncTask<...> {
    private final MenuItem item;
    public DownloadNewsTask(MenuItem item) {
        this.item = item;
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        item.setVisible(true);
    }
    ...
}

然后:

new DownloadNewsTask(item).execute(); 

您还可以让该项成为活动类的成员,如果它被定义为活动的内部类,则可以从任务访问它:

public class TestActivity extends Activity {
protected MenuItem refreshItem;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getSupportMenuInflater().inflate(R.menu.refresh_action_provider, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_refresh:
        this.refreshItem = item;
        item.setVisible(false); // hide refresh button
        setSupportProgressBarIndeterminateVisibility(true);
        Toast.makeText(getApplicationContext(), "REFRESH CLiCKED", Toast.LENGTH_SHORT).show();
        new DownloadNewsTask().execute();
        return true;
    }
    return false;
}
public class DownloadNewsTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        // your stuff...
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        refreshItem.setVisible(true);
    }
}
}

最新更新