在完全不同的类中修改Async任务中的数据

时间:2014-04-05 00:07:49

标签: java android

我想知道是否出于好奇,是否有任何方便的方法从一个类中创建的异步任务中提取数据,然后修改另一个类中的数据(不扩展类)

我有办法做到这一点,但它涉及使方法与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";
    }

}

我想知道,有没有办法可以做到这一点,而不必将异步任务设为静态?也许与共享背景或什么?

顺便说一句,我不是为了解决任何特定问题,我只是出于好奇而

3 个答案:

答案 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模式或生产者 - 消费者模式开始。

查看事件总线库,了解该用例的开箱即用解决方案