我正在尝试将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
我该如何解决这个问题?这是一些访问问题吗?
答案 0 :(得分:3)
而不是
private Runnable myCallback;
使用
private StringRunnable myCallback;
答案 1 :(得分: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
答案 2 :(得分:1)
您必须像以下那样将Runnable
投射到StringRunnable
:
((StringRunnable)myCallback).setResult(result);