【问题标题】:Android get activity from within anonymous classAndroid从匿名类中获取活动
【发布时间】:2015-08-09 10:43:09
【问题描述】:

总的来说,我对 Android 开发和 Java 非常陌生。这是基本设置:我有一个带有AsyncTask 的启动屏幕来检查服务器的可用性。在this 线程之后,我在我的活动中进行了回调。这比在OnPostExecute() 中的工作更有意义,因为我想在不同的活动中重用这个任务。

但是,在我的回调中,我会检查状态是否正常。如果是,它应该启动下一个活动。但是从我的回调上下文来看,我不知道如何获得我的 Activity 引用,我需要它作为 Intent 的参数。

这是我的 Activity 在 OnCreate 下的代码:

    //Check server status
    CheckServiceTask t = new CheckServiceTask(new OnTaskCompleted<ShaggyServiceStatus>() {
        @Override
        public void onTaskCompleted(ShaggyServiceStatus result) {
            Log.i(TAG, "Callback. Result: " + result.getStatus());
            ProgressBar pb = (ProgressBar) findViewById(R.id.splash_progress);
            pb.setVisibility(View.INVISIBLE);

            if (result.getStatusCode() == 999){
                TextView t = (TextView) findViewById(R.id.splash_status_text);
                t.setText(result.getStatus());
                return;
            }

            Intent i = new Intent(getActivity(), LoginActivity.class);
            startActivity(i);
            finish();

        }
    });

    t.execute();

失败的部分是getActivity()。该呼叫不可用。使用this 会引发错误(我理解,因为我在OnTaskCompleted 的上下文中)。

为了完整起见,这是 OnTaskCompleted 的接口:

public interface OnTaskCompleted<T> {
    public void onTaskCompleted(T result);
}

这是 CheckServiceTask 类:

public class CheckServiceTask extends AsyncTask<Void, Void, ShaggyServiceStatus>{
    private static final String TAG = "coo";

    public OnTaskCompleted<ShaggyServiceStatus> listener;

    public CheckServiceTask (OnTaskCompleted<ShaggyServiceStatus> l){
        this.listener = l;
    }

    @Override
    protected ShaggyServiceStatus doInBackground(Void... params) {
        try {
            Log.i(TAG, "Connecting to server...");
            //TODO: Make this a setting
            final String url = "https://someplace.com/status";
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
            //restTemplate.postForObject("url", bodyObject, ShaggySer.class);
            ShaggyServiceStatus sss = restTemplate.getForObject(url, ShaggyServiceStatus.class);
            Log.d(TAG, "Got the status.");
            return sss;
        } catch (Exception e) {
            //TODO: Exception handling
            Log.e(TAG, e.getMessage(), e);
        }

        //If we're here, it's not okay.
        ShaggyServiceStatus r = new ShaggyServiceStatus("Cannot connect to server", 999, "none");

        return r;
    }

    @Override
    protected void onPostExecute(ShaggyServiceStatus result) {
        super.onPostExecute(result);
        listener.onTaskCompleted(result);
    }
}

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:

    使用CurrentClassName.this

    Intent i = new Intent(CurrentClassName.this, LoginActivity.class);
    

    getActivity():与片段一起使用

    返回此片段当前关联的 Activity。

    当你有嵌套类时,class.thisthis 不同。

    【讨论】:

    • 内部类中的this指的是匿名类
    【解决方案2】:

    如果您使用的活动称为“MyActivity”,那么您可以执行以下操作:

    MyActivity.this
    

    这段代码将返回外部类的这个“当前”对象

    【讨论】:

    • 简单干净。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多