用于片段的AsyncTask结果



我有一个关于AsyncTask的问题我使用AsyncTask获取名称的Json列表

这里是我的异步任务

class GetNameAsync extends AsyncTask<String, String, JSONObject> {
    JSONParser jsonParser = new JSONParser();
    private static final String API_URL = "urlhere :-)";
    private static final String TAG_NAMES = "names";
    private ProgressDialog pDialog;
    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Attempting loading...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }
    @Override
    protected JSONObject doInBackground(String... args) {
        try {
            HashMap<String, String> params = new HashMap<>();
            params.put("access", KEY);
            params.put("lang", LANG);
            Log.e("request", "starting");
            JSONObject names_json = jsonParser.makeHttpRequest(API_URL, "GET", params);
            return names_json;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(JSONObject names_json) {
        super.onPostExecute(names_json);
        if (pDialog != null && pDialog.isShowing()) {
            pDialog.dismiss();
        }
        String names_entry = "";
        String mAktienlisteAdapter1 = "";
        try {
            names_entry = names_json.getString(TAG_NAMES);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

这很好但我没有得到的是,我得到的结果是继续使用

我试过了这在onPostExecute

    getFinalResult(String.valueOf(names_entry));

这个在我的碎片中

public static String RESULT = null;
public void getFinalResult(String string) {
    RESULT = string;
}

那么RESULT为空-,-

我已经看了这里,但没有发现任何对我有帮助的东西。如果有人能帮我解决问题,我会很高兴。

编辑这是我的片段.class

public class ThirdFragment extends Fragment {
public static String LANG = null;
public static String KEY = null;
public static String RESULT = null;

class GetNameAsync extends AsyncTask<String, String, JSONObject> {
    JSONParser jsonParser = new JSONParser();
    private static final String API_URL = "urlhere :-)";
    private static final String TAG_NAMES = "names";
    private ProgressDialog pDialog;
    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Attempting loading...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }
    @Override
    protected JSONObject doInBackground(String... args) {
        try {
            HashMap<String, String> params = new HashMap<>();
            params.put("access", KEY);
            params.put("lang", LANG);
            Log.e("request", "starting");
            JSONObject names_json = jsonParser.makeHttpRequest(API_URL, "GET", params);
            return names_json;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(JSONObject names_json) {
        super.onPostExecute(names_json);
        if (pDialog != null && pDialog.isShowing()) {
            pDialog.dismiss();
        }
        String names_entry = "";
        String mAktienlisteAdapter1 = "";
        try {
            names_entry = names_json.getString(TAG_NAMES);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        getFinalResult(String.valueOf(names_entry));
    }
}
public void getFinalResult(String string) {
    RESULT = string;
}
public void setLang(String string){
    LANG = string;
}
public void setKey(String string){
    API_KEY = string;
}
public ThirdFragment() {
    // Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    setHasOptionsMenu(true);
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_third, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    FloatingActionButton fab = (FloatingActionButton) getActivity().findViewById(R.id.fab);
    fab.setVisibility(View.VISIBLE);
    GetNameAsync GetNames = new GetNameAsync();
    GetNames.execute();
    Log.e("RESULT-ASYNC", RESULT);

}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.main1, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == 1) {
        Toast.makeText(getActivity(), "Test 1", Toast.LENGTH_LONG).show();
        return true;
    } else if (item.getItemId() == 2) {
        Toast.makeText(getActivity(), "Test 2", Toast.LENGTH_LONG).show();
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}
}

问题是当您尝试记录RESULT时,异步任务尚未完成。

GetNameAsync GetNames = new GetNameAsync();
GetNames.execute();
Log.e("RESULT-ASYNC", RESULT); // At this point the task may not be complete.

GetNameAsync的方法onPostExecute正在GUI线程中运行,可以访问Fragment上的任何内容,例如标签的文本值等。因此,请尝试从onPostExecute中使用names_entry 的值更新GUI(Fragment(

class GetNameAsync extends AsyncTask<String, String, JSONObject> {
JSONParser jsonParser = new JSONParser();
private static final String API_URL = "urlhere :-)";
private static final String TAG_NAMES = "names";
private ProgressDialog pDialog;
@Override
protected void onPreExecute() {
    pDialog = new ProgressDialog(getActivity());
    pDialog.setMessage("Attempting loading...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(true);
    pDialog.show();
}
@Override
protected JSONObject doInBackground(String... args) {
    try {
        HashMap<String, String> params = new HashMap<>();
        params.put("access", KEY);
        params.put("lang", LANG);
        Log.e("request", "starting");
        JSONObject names_json = jsonParser.makeHttpRequest(API_URL, "GET", params);
        return names_json;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
@Override
protected void onPostExecute(JSONObject names_json) {
    super.onPostExecute(names_json);
    if (pDialog != null && pDialog.isShowing()) {
        pDialog.dismiss();
    }
    String names_entry = "";
    String mAktienlisteAdapter1 = "";
    try {
        names_entry = names_json.getString(TAG_NAMES);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    getFinalResult(String.valueOf(names_entry)); // Here the value has been updated and you can Call you next business depends on the results
}
}

您正在错误的位置打印日志,这是在调用GetNames.execute();之后,并且不建议调用名称以大写字母开头的对象,对象应该是getNames

所以当我写评论时,Log.e("RESULT-ASYNC", RESULT);的调用应该在onPostExecute中。

最新更新