我想知道是否出于好奇,是否有任何方便的方法从一个类中创建的异步任务中提取数据,然后修改另一个类中的数据(不扩展类)
我有办法做到这一点,但它涉及使方法与Async任务本身一起静态
例如,这里我只是在Async任务中创建一个字符串“text”
public class Main extends Activity{
//Context ctx;
static class MyAsyncTask extends AsyncTask<Void,String,String>{
static String result;
private static Context context;
public MyAsyncTask(Context m)
{
this.context = m;
}
@Override
protected String doInBackground(Void... noArgs) {
result = "text";
return result;
}
protected void onPostExecute(String result)
{
super.onPostExecute(result);
}
public static String getStr()
{
return result;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText et = (EditText)findViewById(R.id.editText1);
Button btn = (Button)findViewById(R.id.button1);
MyAsyncTask task = new MyAsyncTask(this);
task.execute();
final Test t = new Test();
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
et.append(t.modifiedString());
}
});
}
}
在一个新类中,我创建了一个简单的String方法来修改异步任务中的数据
public class Test{
public String modifiedString()
{
// Main main = null;
// MyAsyncTask task = new MyAsyncTask(main.ctx);
// task.execute();
String s = (String)Main.MyAsyncTask.getStr();
return "modified " + s + "\n";
}
}
我想知道,有没有办法可以做到这一点,而不必将异步任务设为静态?也许与共享背景或什么?
顺便说一句,我不是为了解决任何特定问题,我只是出于好奇而
答案 0 :(得分:1)
只需创建一个单身人士
public class Main extends Activity{
public static Main instance;
public static String thestring;
public class MyAsyncTask extends AsyncTask<Void,String,String>{
static final String result = "text";
Context context;
public MyAsyncTask(Context m)
{
this.context = m;
}
@Override
protected String doInBackground(Void... noArgs) {
return result;
}
protected void onPostExecute(String result)
{
super.onPostExecute(result);
}
public String getStr()
{
return result;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText et = (EditText)findViewById(R.id.editText1);
Button btn = (Button)findViewById(R.id.button1);
MyAsyncTask task = new MyAsyncTask(this);
task.execute();
thestring = task.getStr();
instance = this;
final Test t = new Test();
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
et.append(t.modifiedString());
}
});
}
public String pulledFromAsyncTask()
{
return thestring;
}
public static Main getInstance(){
return instance;
}
}
然后在另一个班级
public class Test{
public String modifiedString()
{
Main main = Main.getInstance();
//so with main.something.. you can call the methods you want
//a good solution is to make a singleton class only for MyAsyncTask setting the
//functions get/set so you can take the values from other classes
return "modified " + main.pulledFromAsyncTask() + "\n";
}
}
答案 1 :(得分:0)
以静态方式引用Context
通常是个坏主意,它可能导致memory leaks
为什么不简单地将MyAsyncTask
对象传递给Test
,然后做你想要的任何修改,即非静态时尚?
答案 2 :(得分:0)
说到可测试代码静态/单例是一个艰难的选择。
根据您对数据状态的要求,您可以从Observer模式或生产者 - 消费者模式开始。
查看事件总线库,了解该用例的开箱即用解决方案