在运行之前访问Runnable的方法

时间:2014-07-21 12:34:46

标签: java android

我正在尝试将Runnable传递给AsyncTask,然后将doInBackgroud的结果设置为它并运行它。

我正在尝试以下代码但没有成功。

// MyActivity.java
public void click(View v) {
    if(v.getId() == R.id.button) {
        new AsyncHTTP(myAsyncClassCallback()).execute();
    }
}

public Runnable myAsyncClassCallback() {
    return new StringRunnable() {
        @Override
        public void run() {
            Log.v(DEBUG_TAG,result.toString());
        }
    };
}

// StringRunnable.java
public class StringRunnable implements Runnable {
    volatile String result;

    public void setResult(String res) {
        this.result = res;
    }

    @Override
    public void run() {
        // do something with result
    }
}

// MyAsyncClass.java
public class MyAsyncClass extends AsyncTask<String, Integer, String>{

    private Runnable myCallback;

    public MyAsyncClass(Runnable runnable){
        this.myCallback = runnable;
    }

    @Override
    protected String doInBackground(){
        // works normally
        return someString;
    }

    @Override
    protected void onPostExecute(String result) {
        myCallback.setResult(result); // <--- This is my question
        myCallback.run();
        super.onPostExecute(result);
    }
}

所以我收到了消息:

  

无法解析方法setResult

我该如何解决这个问题?这是一些访问问题吗?

3 个答案:

答案 0 :(得分:3)

而不是

private Runnable myCallback;

使用

private StringRunnable myCallback;

答案 1 :(得分:3)

您宣布myCallbackRunnable,但Runnable不包含setResult(String result)的定义。但是,你的扩展课程确实如此。这意味着您应该将Runnable投射到StringRunnable,实际上是

((StringRunnable)myCallback).setResult(result);

或者您应该将myCallback声明为StringRunnable

private StringRunnable myCallback;
编辑:正如Unihedron指出的那样,最后一个选项意味着你必须改变你的构造函数

private StringRunnable myCallback;

public MyAsyncClass(StringRunnable runnable){
    this.myCallback = runnable;
}
但是,我应该注意,在您的情况下,不必使用两个非UI线程。 AsyncTask也是Thread

答案 2 :(得分:1)

您必须像以下那样将Runnable投射到StringRunnable

((StringRunnable)myCallback).setResult(result);