Java 在完全不同的类中修改异步任务中的数据
出于好奇,我想知道是否有任何方便的方法可以从类中创建的异步任务中提取数据,然后在另一个类中修改数据(不扩展类) 我有办法做到这一点,但这涉及到使方法与异步任务本身保持静态 例如,这里我只是在异步任务中生成一个字符串“text”Java 在完全不同的类中修改异步任务中的数据,java,android,Java,Android,出于好奇,我想知道是否有任何方便的方法可以从类中创建的异步任务中提取数据,然后在另一个类中修改数据(不扩展类) 我有办法做到这一点,但这涉及到使方法与异步任务本身保持静态 例如,这里我只是在异步任务中生成一个字符串“text” public class Main extends Activity{ //Context ctx; static class MyAsyncTask extends AsyncTask<Void,String,String>{
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());
}
});
}
}
我想知道,有没有一种方法可以做到这一点,而不必使异步任务成为静态的?也许是通过共享上下文或其他什么
顺便说一句,我这样做并不是为了解决任何特定的问题,我只是出于好奇而这样做以静态方式引用
上下文
通常是个坏主意,它可能导致
为什么不直接将
MyAsyncTask
对象传递给Test
,然后做任何需要的修改,即非静态方式?只需创建一个单例即可
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;
}
}
当涉及到可测试代码时,静态/单例是一个艰难的选择 但是,根据您对数据状态的要求,您可以从观察者模式或生产者-消费者模式开始
请查看事件总线库,以获取此用例的现成解决方案这里仅澄清一点,您正试图从另一个线程访问线程的内容。这就是你想要实现的吗?不仅要访问它,还要修改它,这样我就可以把结果带回主类了。。。假设您的线程将在doInBackground内部循环,您可以使用onProgressUpdate将新更改的字符串存储在AsyncTask实例中,您可以通过getter检索它。。。这样你就可以保证线程安全。是的,我实际上是想这样做的,但出于某种原因,它不允许我这样做,除非一切都是静态的。也许我没有正确地使用上下文(事实上,这是一个全新的概念)。。我不知道如何使它工作这看起来是合乎逻辑的,但当我尝试它时,字符串仅在从异步任务获取时为空,我认为这是因为它只能从异步任务内部获取主实例,而不能从异步任务内部获取实例是的,您应该创建一个函数setText(字符串文本)到main,以便可以从异步调用它,然后在main中创建另一个函数getText,该函数返回在setText中设置的文本。。。在MyAsync中调用onPostExecute函数中的setText在onPostExecute中调用setter将永远不会起作用-getter将始终看到null,但还有其他选择
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";
}
}