我有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
答案 0 :(得分:4)
我为您的问题提供了多种解决方案。
最重要的是,您将活动类的上下文作为异步任务类的数据成员传递,然后在onPostExecute中完成工作
((YourActivityName)上下文).createDynamicImages(yourJsonArray);
在此之前,您需要将活动的上下文保存为异步任务类的数据成员
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);