Передать результат 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(), так что он вызывается только после заполнения массива.

Другие вопросы по тегам