【问题标题】:AsyncTask Result for use in Fragment在 Fragment 中使用的 AsyncTask 结果
【发布时间】:2016-11-02 00:37:57
【问题描述】:

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

这是我的AsyncTask

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是空的-,-

已经看过这里但没有找到任何对我有帮助的东西。 如果有人可以帮助我解决我的问题,我会很高兴。

编辑 这是我的Fragment.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);
    }
}
}

【问题讨论】:

  • 你是在一个单独的类中异步任务还是在你的 Fragment 内部
  • 这是我的片段类
  • 你检查过 names_json 值了吗?
  • 是的 name_json 值是 {"names":["name1","name2","name3"]} 并且 name_entry 是 [ "name1","name2","name3"] 和 name_entry 是我在异步之外的下一个工作所需要的
  • 你能把整个 Fragment 类发一下吗

标签: java android android-studio android-asynctask


【解决方案1】:

问题是当您尝试记录 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 中更新您的 GUI(片段)您为 names_entry 获得的值

【讨论】:

  • 您可以通过从 onPostExecute 调用 findViewById 来访问 Fragment 布局上的任何 ui 元素。然后,您可以使用 names_entry 中的值更新该 gui 元素
  • 我将使用这个 names_entry 在 onCreateOptionsMenu 中创建一个菜单,为此我需要在异步之外使用这个
【解决方案2】:
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

【讨论】:

  • 在这个地方没问题,但这有助于我不要在异步之外使用结果
  • 你不能在异步完成之前使用它的结果,并且在完成后使用它,调用一个监听器或任何在异步之外调用你的登录。
  • 我该如何与听众一起做呢?
  • 我使用的是 Fragment 而不是 Activity
  • 在你的片段而不是活动中实现 OnTaskCompleted
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多