如何将数据从异步类传递到主要活动类

时间:2016-04-07 17:49:51

标签: java android android-layout android-asynctask

我有JSON数据,我转换为JSONArray。我在一个扩展AsyncTask的内部类中执行了此转换。

现在我的数据包含Images及其Titles。我想创建一个Loop并动态创建ImageView

我面临的问题是我的数据是在内部类和doInBackground()方法中,以及它们的内容;即:ImageView我需要在外层和onCreate()方法中创建。

我无法理解如何使用我在我的外部课程jsonArray中创建的InnerClass

内部班级:

公共类NewsService扩展了AsyncTask {

    @Override
    protected JSONArray doInBackground(String... params) {

        URL url = null;
        try {
          //All JSON to JSONArray conversion code goes here
          //..

          JSONArray jsonArray = new JSONArray(jsonString);
         return jsonArray; 

主要活动

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        NewsService newsService = new NewsService();
        newsService.execute();

//I need to use `jsonArray` in this part of my code

3 个答案:

答案 0 :(得分:4)

我为您的问题提供了多种解决方案。

  1. 最重要的是,您将活动类的上下文作为异步任务类的数据成员传递,然后在onPostExecute中完成工作

    ((YourActivityName)上下文).createDynamicImages(yourJsonArray);

  2. 在此之前,您需要将活动的上下文保存为异步任务类的数据成员

    YourAsyncTask task = new YourAsyncTask(this);
    task.execute();
    

    因此异步任务类的构造函数将成为

    public YourAsyncTask(Context context){
        this.context = context;
    }
    

答案 1 :(得分:2)

一种简单的方法是将interface定义为AsyncTask的回调。这是一个例子:

public interface Callback {
    void processData(DataType data);
}

并且在MainActivity implement interface public class MainActivity extends Activity implements Callback { ... void processData(DataType data) { //your code here } }

new NewService(this).execute();

并在您的主叫代码中:

NewService

和您的public class NewService extends AsyncTask ... { ... Callback cb; public NewService(Callback cb) { this.cb = cb; } ... } 班级:

Callback

并在onPostExecute

中调用您的void onPostExecute(DataType data) { cb(data); } 方法
System.config({
                defaultJSExtensions: true,
                packages: {
                    'app': { format: 'register', "defaultExtension": 'js' }
                },
                map: {
                    'angular2': 'node_modules/angular2',
                    'primeng': 'node_modules/primeng',
                    'rxjs': 'node_modules/rxjs',
                    'ng2-uploader': 'node_modules/ng2-uploader/ng2-uploader',
                    'countryjs': 'node_modules/countryjs'
                }
            });

答案 2 :(得分:0)

AsynTask.doInBackground在主线程上的背景上运行,因此您应该使用onPostExecute (此方法在之后运行任务完成)如果您想要主线程上的流程数据(包括UI更新),您可以在interface类中使用AsyncTask来实现这一目标:

    interface OnJsonArrayReceive {
    void onReceive(JSONArray array);
    }

AsyncTask课程将如下所示:

   class SomeTask extends AsyncTask<String, Void, JSONArray> {

    OnJsonArrayReceive mOnJsonArrayRecieve;

    public SomeTask(OnJsonArrayRecieve listener) {
        mOnJsonArrayRecieve = listener;
    }

    @Override
    protected JSONArray doInBackground(String... params) {
        //do something with and return your array
        //this runs on background
        return jsonArray;
    }

    @Override
    protected void onPostExecute(JSONArray jsonArray) {
        //This runs on main thread
        if (mOnJsonArrayReceive != null) {
            mOnJsonArrayReceive.onReceive(jsonArray);
        }
    }
}

此类将OnJsonArrayRecieve侦听器作为参数(在MainActivity中实现,并且当后台上的数据处理完成时onRecieve将是调用,在你的代码中使用它:

    new SomeTask(new OnJsonArrayRecieve() {
        @Override
        public void onReceive(JSONArray array) {
            //do something with json array
        }
        }).execute(someArgument);