AsyncTask 不使用 BaseAdpter 创建 GridView

AsyncTask not create GridView using BaseAdpter

我是 android 开发的新手,对此我有非常基本的了解,到目前为止我所取得的一切都是使用这个网站或 youtube 视频实现的,我被困在 AsyncTask 中(之前我使用 .get()创建视图,它工作正常,但 UI 在任务完成之前被阻塞。为了避免 UI 阻塞,我建议在删除此函数后立即从 OnCreateView() 函数中删除 .get() 函数,我没有被能够从 AsyncTask 获取任何数据)。我做到了,但现在我无法创建视图我做了很多研究但无法获得这种力量

这是我的代码请帮助如何从中创建视图

OnCreateView() :-

    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View GView = inflater.inflate(R.layout.fragment_dashboard, container, false);
    progressBarHolder = (FrameLayout) GView.findViewById(R.id.progressBarHolder);
    GridView gridView = (GridView) GView.findViewById(R.id.gridView);
    //Toast.makeText(getActivity(),Json_String,Toast.LENGTH_LONG).show();
    String finalResult = null;
    try{
        finalResult = String.valueOf(new JSONTask().execute("https://www.example.in/android_api/dashboard_data",JsonData()));
        Toast.makeText(getActivity(),Json_String,Toast.LENGTH_LONG).show();
        JSONObject parentObject = null;
        parentObject = new JSONObject(finalResult);
        if(((String) parentObject.names().get(0)).matches("error")){
            JSONObject jObj = parentObject.getJSONObject("error");
            errorThrow(jObj.getString("Description"));
        } else if(((String) parentObject.names().get(0)).matches("success")){
            JSONObject jObj = parentObject.getJSONObject("success");
            JSONArray arrajson = jObj.getJSONArray("data");
            String arrayCount = Integer.toString(arrajson.length());
            String[] type = new String[arrajson.length()];
            Integer[] count = new Integer[arrajson.length()];
            for (int i=0; i<arrajson.length();i++){
                JSONObject jsonObject = arrajson.getJSONObject(i);
                type[i] = jsonObject.getString("type");
                count[i] = jsonObject.getInt("count");
            }
            CustomAdpter customAdpter = new CustomAdpter(DashboardFragment.this,type,count);
            gridView.setAdapter(customAdpter);
            return GView;
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return GView;
}

基本适配器代码:-

    class CustomAdpter extends BaseAdapter {

    String[] type;
    Integer[] count;
    public CustomAdpter(DashboardFragment dashboardFragment, String[] type, Integer[] count){
        this.count = count;
        this.type = type;
    }
    @Override
    public int getCount() {
        return type.length;
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        view = getLayoutInflater().inflate(R.layout.grid_single_itme,null);
        TextView textView = (TextView) view.findViewById(R.id.TextView1);
        TextView textView1 = (TextView) view.findViewById(R.id.textView2);
        textView.setText(String.valueOf(count[i]));
        textView1.setText(type[i]);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(),"Booking Item Clicked",Toast.LENGTH_LONG).show();
            }
        });
        return view;
    }
}

AsyncTask 代码:-

    public class JSONTask extends AsyncTask<String,String,String> {
    private ProgressDialog mProgressDialog;

    int progress;
    public JSONTask(){
        mProgressDialog = new ProgressDialog(getContext());
        mProgressDialog.setMax(100);
        mProgressDialog.setProgress(0);
    }

    @Override
    protected void onPreExecute(){
        mProgressDialog = ProgressDialog.show(getContext(),"Loading","Loading Data...",true,false);
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        final String finalJson = params[1];
        String json = finalJson;
        try{
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(5000);
            connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            connection.setRequestProperty("A-APK-API", "******");
            connection.setRequestProperty("Authorization", "Basic **:**");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestMethod("POST");
            connection.connect();

            OutputStream stream = connection.getOutputStream();
            OutputStreamWriter streams =  new OutputStreamWriter(stream, "UTF-8");
            stream.write(json.getBytes("UTF-8"));
            stream.close();

            reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));

            StringBuffer buffer = new StringBuffer();

            String line = "";
            while((line = reader.readLine()) != null){
                buffer.append(line);
            }
            return buffer.toString();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(connection != null){
                connection.disconnect();
            }
            try {
                if(reader != null) {
                    reader.close();
                }
            } catch (IOException e){
                e.printStackTrace();
            }
        }
        return null;
    }
    protected void onPostExecute(String result){
        super.onPostExecute(result);
        Json_String = result;
        Toast.makeText(getContext(),result,Toast.LENGTH_LONG).show();
        mProgressDialog.dismiss();
    }
}

请帮帮我

您应该更改创建适配器和附加的方式 你应该这样做

1.At首先通过AsyncTask,doInBackGround方法

获取List,ArrayList等中的数据
  1. 然后在 onPostExecute 方法上检索数据并创建适配器并将其附加到您的视图
  2. 在获取数据的同时,您可以显示一些 ProgressDialog
  3. 如果您的 AsyncTask 在其他单独的 class 中,则使用接口从您的 AsyncTask class 中获取数据 看看这个

不使用 .get() 时无法从 asynctask 获得结果。

所以改变那个说法。仅启动异步任务。

然后将所有代码放在该行之后的 AsyncTask 的 onPostExecute() 中。

就这些了。