在运行Runnable之前访问其方法

3
我正在尝试将一个Runnable传递给AsyncTask,然后将doInBackground的结果设置为它并运行它。
我正在尝试以下代码,但没有成功。
// 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);
    }
}

So I get the message:

Cannot resolve method setResult

How can I fix this? Is this some access issue?


2
顺便提一下,最好使用asynTask并摆脱Runnable类。您可以在asyncTask的onPostExecute中执行Runnable的任务“对结果进行某些操作”。同时使用两者的代码不仅无关紧要,而且可能会导致没有理由的两个不同后台线程。 - My God
3个回答

3

你声明了 myCallback 是一个 Runnable,但是 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


请注意,第二种方法需要更改构造函数,当前为this.myCallback = runnable;其中声明了Runnable runnable - Unihedron

3
代替
private Runnable myCallback;

使用

private StringRunnable myCallback;

1
您需要将Runnable转换为StringRunnable,方法如下:
((StringRunnable)myCallback).setResult(result);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接