Передать результат AsyncTask в onCreateView во фрагменте
Вот моя ситуация: в моем onCreate() я хотел бы создать AsyncTask для извлечения данных для WebService и сохранения их в ArrayList(Retrive points for graph).
Затем в моем onCreateView() я хотел бы использовать ArrayList и перебирать его для построения точек...
Я хотел бы каким-то образом убедиться, что я жду, пока AsyncTask завершит выполнение, прежде чем запускать функцию onCreateView(). Затем я использовал обратный вызов в onPostExecute, но он не работает. Я читал об использовании get () в задаче, но если я использую метод get (), пользовательский интерфейс метода будет заблокирован. Так что единственный возможный способ использовать метод обратного вызова в onPostExecute.
Но мой код работает следующим образом, прежде чем завершить выполнение Aysnctask onCreateView и получить исключение NullPointer в этой строке if(PF.size()!= 0).
package hello.aws.graphs;
import android.support.v7.app.AppCompatActivity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import hello.aws.login.WebService;
public class PFGraph extends AppCompatActivity implements AsyncTaskCompleteListener {
public static boolean errored = false;
static ProgressDialog dialog = null;
public static Menu menu;
static ArrayList<PFKVABean> PF;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_line_chart);
getData();/*Getting data from webservice**/
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent newIntent;
switch (item.getItemId()) {
case R.id.bb_menu_favorites:
getData();/*Getting data from webservice**/
break;
case R.id.bb_menu_recent:
getData();/*Getting data from webservice**/
break;
case R.id.bb_menu_recents:
getData();/*Getting data from webservice**/
break;
}
return true;
}
public void getData()
{
AsyncCallWS task = new AsyncCallWS(this);
task.execute();
}
@java.lang.Override
public void onTaskComplete(Object result) {
PF=(ArrayList)result;//Storing result of AsyncTask
Log.e("check","check");
}
/**
* A fragment containing a line chart.
*/
public static class PlaceholderFragment extends Fragment {
private LineChartView chart;
private LineChartData data;
private int numberOfLines = 2;
private boolean hasLines = true;
private boolean hasPoints = true;
private ValueShape shape = ValueShape.CIRCLE;
private boolean isFilled = false;
private boolean hasLabels = false;
private boolean isCubic = false;
private boolean hasLabelForSelected = false;
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
View rootView = inflater.inflate(R.layout.fragment_pf_graph, container, false);
chart = (LineChartView) rootView.findViewById(R.id.chart);
chart.setOnValueTouchListener(new ValueTouchListener());
generateData();
return rootView;
}
private void generateData() {
chart.setZoomEnabled(true);
chart.setZoomType(ZoomType.HORIZONTAL);
List<Line> lines = new ArrayList<Line>();
List<AxisValue> axisValues = new ArrayList<AxisValue>();
if(!errored) {
if (PF.size() != 0) {/******NULL Pointer Exception***/
/****Here the logic for plotting the points on graph***/
}
else
{
Toast.makeText(getActivity(), "Error occured in invoking Webservice", Toast.LENGTH_LONG).show();
}
}
}
}
private class AsyncCallWS extends AsyncTask<String, Void, ArrayList> {
private AsyncTaskCompleteListener<ArrayList> callback;
public AsyncCallWS(AsyncTaskCompleteListener<ArrayList> cb) {
this.callback = cb;
}
@java.lang.Override
protected ArrayList doInBackground(String... params) {
PF=WebService.GetWSData();
return PF;
}
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(PFGraph.this, R.style.MyTheme);
dialog.setProgressStyle(android.R.style.Widget_ProgressBar_Small);
dialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.cp_bar));
dialog.setCancelable(false);
dialog.show();
// getSupportFragmentManager().beginTransaction().replace(R.id.container, new PlaceholderFragment()).commit();
}
@Override
protected void onPostExecute(ArrayList PF) {
if(dialog!=null||dialog.isShowing()) {
dialog.dismiss();
Log.e("v","v");
callback.onTaskComplete(PF);//Sending result
}
}
}
}
1 ответ
Переместить звонок на generateData();
от onCreateView()
в onTaskComplete()
, так что он вызывается только после заполнения массива.