我是android的初学者。如何从 AsyncTask 获取数据到占位符fragment2类我无法从AsyncTask访问actor列表。如果我将数据作为放置片段中的数组获取,我可以使用它来创建列表视图从异步任务检索的数据。
public static class PlaceholderFragment2 extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number";
ListView list;
ActorsAdapter adapter;
ArrayList<Actors> actorsList;
public static PlaceholderFragment2 newInstance(int sectionNumber) {
PlaceholderFragment2 fragment = new PlaceholderFragment2();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment2() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_json, container, false);
list = (ListView) rootView.findViewById(R.id.listView_news);
actorsList = new ArrayList<Actors>();
new ActorsAsyncTask().execute("https://myurl.com");
//EDITED Code
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MyActivity) activity).onSectionAttached(
getArguments().getInt(ARG_SECTION_NUMBER));
}
}
public static class ActorsAsyncTask extends AsyncTask<String,Void,Boolean>
{
@Override
protected Boolean doInBackground(String... strings) {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(strings[0]);
try {
HttpResponse response = client.execute(post);
int status = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
String data = EntityUtils.toString(entity);
if(data != null) {
JSONObject object = new JSONObject(data);
String results = object.getString("results");
Log.d("Response: ", "> " + results);
JSONObject object1 = new JSONObject(results);
JSONArray jArray = object1.getJSONArray("collection1");
for (int i = 0; i < jArray.length(); i++) {
Actors actor = new Actors();
JSONObject object2 = jArray.getJSONObject(i);
String property1 = object2.getString("property1");
JSONObject object3 = new JSONObject(property1);
actor.setHref(object3.getString("href"));
String href = object3.getString("href");
actor.setText(object3.getString("text"));
String text = object3.getString("text");
// Log.d("text", text);
Log.d("href", href);
Log.d("text",text);
actorsList.add(actor);////////////////not working
}
}
else{
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
public class Actors {
private String text ;
private String href;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getHref() {
return href;
}
public void setHref(String href) {
this.href = href;
}
public Actors(){
}
}
答案 0 :(得分:4)
你可以指定你的doInBackground的结果(现在你有布尔值)在onPostExecute(在主线程中工作)得到这个结果
public static class ActorsAsyncTask extends AsyncTask<String,Void,List<Actors>> {
@Override
protected List<Actors> doInBackground(String... strings) {
//make request and get actors
List<Actors> result = new ArrayList<Actors>();
for (int i = 0; i < jArray.length(); i++) {
Actrots actorsFromJson;
//create actors object from JSON data
result.add(actorsFromJson);
}
return result;
}
@Override
public void onPostExecute(List<Actors> result) {
actorsList.addAll(result);
//TODO processing data for display it. This is UI thread.
}
}
<强> UPD:强> 您的异步任务类不是片段的内部类,因此,您有两种解决方法:
1)创建界面并将其设置为AsyncTask以获得任何反应
public interface TaskResult {
void onSuccess(List<Actors> result);
}
在TaskResult taskResult;
类
ActorsAsyncTask
您可以从构造函数设置值:
public ActorsAsyncTask(TaskResult taskResult) {
this.taskResult = taskResult;
}
或来自setter
public void setTaskResultCallback() {
this.taskResult = taskResult;
}
然后从taskResult.onSuccess(result);
onPostExecute
2)您可以将ActorsAsyncTask
签名更改为public class ActorsAsyncTask
并把它放到PlaceholderFragment2
类,如:
public static class PlaceholderFragment2 extends Fragment {
//some code here
public class ActorsAsyncTask extends AsyncTask {
//some code here
}
}
如果您的应用程序的逻辑可以接受它。