对非静态方法进行静态引用

时间:2013-08-24 14:35:49

标签: java android static android-asynctask

我有一个代码,我在AsyncTask中发出http请求

public class Sendcolorvalue extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);

    }

    @Override
    protected String doInBackground(String... params) {
    //do your work here
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpPost = new HttpGet("http://192.168.0.102/HR/index.php?command=" + command);
        try {
            HttpResponse response = httpClient.execute(httpPost);
        } catch (ClientProtocolException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
           // do something with data here-display it or send to mainactivity
    }

}

我想要的是从菜单项选择的事件中执行它,所以我输入:

Sendcolorvalue.execute();

并出现错误:

  

无法从类型AsyncTask

中对非静态方法execute(String ...)进行静态引用

2 个答案:

答案 0 :(得分:1)

您尝试访问该方法的方式是,因为您可以从异常中读取“静态”方式,这意味着您正在考虑如果系统中只运行该类的一个“副本”。 这是非常困难的,因为它是一个“任务”(AsyncTask),所以有可能你需要更多的那个类的实例,只需要几个字就可以了解该类的一个“副本”。

每个任务将与其他任务分开执行,因此您必须将自己的方法称为“执行”。

如何告诉JVM这一切?

Sendcolorvalue sender = new Sendcolorvalue(params);
sender.execute();

请注意,如果你这样做:

Sendcolorvalue sender = new Sendcolorvalue(params);
Sendcolorvalue secondsender = new Sendcolorvalue(params);
sender.execute();

只有两个发件人中的第一个将处于活动状态。

如果你使用类似的东西:

Sendcolorvalue.execute();

(我记得你是不可能的,因为没有静态执行方法) 您正在创建一个逻辑问题。

我建议你阅读有关静态和实例化类的内容。

答案 1 :(得分:0)

您需要通过以下方式创建类的实例:

Sendcolorvalue scv = new Sendcolorvalue();

您现在可以通过调用您所做的方法来执行代码。 例如:

scv.myMethod();