我有一个关于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
中。