java - AsyncTask 不使用 BaseAdpter 创建 GridView

标签 java android gridview android-asynctask baseadapter

我是 Android 开发新手,对此有非常基本的了解,到目前为止我所取得的成就都是使用这个网站或 youtube 视频实现的,我陷入了 AsyncTask (早些时候我在 Create View 上使用 .get() 并且它正在工作)很好,但是 UI 被阻止,直到任务完成。为了避免 UI 阻塞,我建议在删除此函数后立即从 OnCreateView() 函数中删除 .get() 函数,因为我无法从 AsyncTask 获取任何数据。我这样做了,但现在我无法创建 View ,我做了很多研究,但无法获得这种优势

这是我的代码,请帮助如何从中创建 View

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;
    }
}

异步任务代码:-

    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();
    }
}

请帮助我

最佳答案

当您不使用 .get() 时,您无法从 asynctask 获取结果。

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

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

仅此而已。

关于java - AsyncTask 不使用 BaseAdpter 创建 GridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47375294/

相关文章:

java - Spring:在应用程序主要方法中运行多个 "SpringApplication.Run()"

java - 更新 Maven 项目模块中的父版本

java - Android 的 Kotlin "expensive"中的枚举类是否与 Java 中的一样?

c# - 将 gridView 导出到 Excel 时出现问题

asp.net - 在数据绑定(bind)期间显示来自不同表的列

mysql - Shield UI 网格日期 : how to format

java - 是否可以在 java 中创建 Enum 类型的对象?

java - 从在后台线程上执行的方法获取 int 值

java - 无法裁剪位图

android - 如何构建具有可用隐藏和内部 API 的 Android SDK?