【问题标题】:Pass AsyncTask result to onCreateView in Fragment将 AsyncTask 结果传递给 Fragment 中的 onCreateView
【发布时间】:2016-08-25 05:18:25
【问题描述】:

这是我的情况: 在我的 onCreate() 中,我想创建一个 AsyncTask 来检索 WebService 的数据并将其存储在 ArrayList(Retrive points for graph)中。

然后在我的 onCreateView() 中,我想使用 ArrayList 并对其进行迭代以绘制点...

我想要一些方法来确保在启动 onCreateView() 函数之前等待 AsyncTask 完成执行。然后我在 onPostExecute 中使用了回调,但它不起作用。我读过关于在任务上使用 get(),但是如果我使用 get() 方法 UI 将被阻止。所以只有在 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
        }

    }

}
}

【问题讨论】:

  • 首先调用 AsyncTask 和 onPostExecute(result) 在 PlaceHolderFragment.newInstance(YourClassToSend) 中调用您的片段

标签: android android-fragments android-asynctask oncreate


【解决方案1】:

将generateData();的调用从onCreateView()移动到onTaskComplete(),这样只有在数组被填充后才会调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2023-04-03
    相关资源
    最近更新 更多