Android 从onPostExecute到OnCreateView获取JSON字符串

Android 从onPostExecute到OnCreateView获取JSON字符串,android,android-asynctask,Android,Android Asynctask,我需要从onPostExecute(异步任务)获取var s(commnet)到onCreatView(以便绘制图表)。 这是我的代码: 我尝试了很多解决方案,但我做不到 String url; HashMap<String, String> params; int requestCode; PerformNetworkRequest3(String url, HashMap<String, String> params, int requestC

我需要从onPostExecute(异步任务)获取var s(commnet)到onCreatView(以便绘制图表)。 这是我的代码: 我尝试了很多解决方案,但我做不到

String url;
    HashMap<String, String> params;
    int requestCode;
    PerformNetworkRequest3(String url, HashMap<String, String> params, int requestCode) {
        this.url = url;
        this.params = params;
        this.requestCode = requestCode;
    }
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        try {
            JSONObject object = new JSONObject(s);
            if (!object.getBoolean("error")) {
                Toast.makeText(getContext(), object.getString("message"), Toast.LENGTH_SHORT).show();
                s = (object.getString("category"));  //need var s -> oncreateview
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    @Override
    protected String doInBackground(Void... voids) {
        RequestHandler requestHandler = new RequestHandler();

        if (requestCode == CODE_POST_REQUEST)
            return requestHandler.sendPostRequest(url, params);
        if (requestCode == CODE_GET_REQUEST)
            return requestHandler.sendGetRequest(url);

        return null;
    }
stringurl;
HashMap参数;
int请求码;
PerformNetworkRequest3(字符串url、HashMap参数、int requestCode){
this.url=url;
this.params=params;
this.requestCode=requestCode;
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
试一试{
JSONObject对象=新的JSONObject;
如果(!object.getBoolean(“错误”)){
Toast.makeText(getContext(),object.getString(“message”),Toast.LENGTH_SHORT.show();
s=(object.getString(“category”);//需要var s->oncreateview
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
@凌驾
受保护的字符串背景(无效…无效){
RequestHandler RequestHandler=新的RequestHandler();
if(requestCode==CODE\u POST\u请求)
返回requestHandler.sendPostRequest(url,参数);
if(requestCode==CODE\u GET\u请求)
返回requestHandler.sendGetRequest(url);
返回null;
}

只需创建一个回调接口。最终的解决方案是

new PerformNetworkRequest3("", new HashMap<>(), 0, new PerformNetworkRequest3.OnResult() {
    @Override
    public void onSuccess(String s) {
        // check response here.
    }

    @Override
    public void onError() {

    }
});
new PerformNetworkRequest3(“,new HashMap(),0,new PerformNetworkRequest3.OnResult()){
@凌驾
成功时的公共void(字符串s){
//在这里检查响应。
}
@凌驾
公开无效{
}
});
并将下面的内容替换为您的AsyncTask

import android.os.AsyncTask;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;

/**
 * Created by KHEMRAJ on 7/23/2018.
 */
public class PerformNetworkRequest3 extends AsyncTask<Void, Void, String> {
    String url;
    HashMap<String, String> params;
    int requestCode;
    private OnResult onResult;

    private interface OnResult{
        void onSuccess(String s); // you can change this String to any, like JsonObject            
        void onError();
    }

    PerformNetworkRequest3(String url, HashMap<String, String> params, int requestCode, OnResult onResult) {
        this.url = url;
        this.params = params;
        this.requestCode = requestCode;
        this.onResult = onResult;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        try {
            JSONObject object = new JSONObject(s);
            onResult.onSuccess(s);
            if (!object.getBoolean("error")) {
                Toast.makeText(getContext(), object.getString("message"), Toast.LENGTH_SHORT).show();
                s = (object.getString("category"));  //need var s -> oncreateview
            }
        } catch (JSONException e) {
            e.printStackTrace();
            onResult.onError();
        }
    }

    @Override
    protected String doInBackground(Void... voids) {
        RequestHandler requestHandler = new RequestHandler();
        if (requestCode == CODE_POST_REQUEST)
            return requestHandler.sendPostRequest(url, params);
        if (requestCode == CODE_GET_REQUEST)
            return requestHandler.sendGetRequest(url);

        return null;
    }
}
导入android.os.AsyncTask;
导入android.widget.Toast;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.util.HashMap;
/**
*由KHEMRAJ于2018年7月23日创建。
*/
公共类PerformNetworkRequest3扩展了异步任务{
字符串url;
HashMap参数;
int请求码;
私有OnResult-OnResult;
私有接口OnResult{
void onSuccess(字符串s);//可以将此字符串更改为任意字符串,如JsonObject
void onError();
}
PerformNetworkRequest3(字符串url、HashMap参数、int-requestCode、OnResult-OnResult){
this.url=url;
this.params=params;
this.requestCode=requestCode;
this.onResult=onResult;
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
试一试{
JSONObject对象=新的JSONObject;
onResult.onSuccess;
如果(!object.getBoolean(“错误”)){
Toast.makeText(getContext(),object.getString(“message”),Toast.LENGTH_SHORT.show();
s=(object.getString(“category”);//需要var s->oncreateview
}
}捕获(JSONException e){
e、 printStackTrace();
onResult.onError();
}
}
@凌驾
受保护的字符串背景(无效…无效){
RequestHandler RequestHandler=新的RequestHandler();
if(requestCode==CODE\u POST\u请求)
返回requestHandler.sendPostRequest(url,参数);
if(requestCode==CODE\u GET\u请求)
返回requestHandler.sendGetRequest(url);
返回null;
}
}
这只是一个实现。您可以根据需要更改回调方法。还可以正确管理
onError()
onsuces()
尝试以下操作:-

String url;
HashMap<String, String> params;
int requestCode;

public AsyncResponse delegate=null;

public interface AsyncResponse {
    void processFinish(String output);
}

 PerformNetworkRequest3(Context ctx, AsyncResponse asyncResponse) {
     context = ctx;
     delegate = asyncResponse;
}

PerformNetworkRequest3(String url, HashMap<String, String> params, int requestCode) {
    this.url = url;
    this.params = params;
    this.requestCode = requestCode;
}
@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    try {
        JSONObject object = new JSONObject(s);
        if (!object.getBoolean("error")) {
            Toast.makeText(getContext(), object.getString("message"), Toast.LENGTH_SHORT).show();
            s = (object.getString("category"));  //need var s -> oncreateview

        delegate.processFinish(s);

        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
@Override
protected String doInBackground(Void... voids) {
    RequestHandler requestHandler = new RequestHandler();

    if (requestCode == CODE_POST_REQUEST)
        return requestHandler.sendPostRequest(url, params);
    if (requestCode == CODE_GET_REQUEST)
        return requestHandler.sendGetRequest(url);

    return null;
}

请具体说明,我没有收到您的问题。您好,Khemraj,variable从json收到了值,但您想在OncreateView(fragment)上获取值,但无法执行此错误:s=null无法执行此操作,我有“public String flag”,当我在onSuccess和(与您相同)上响应json时,然后分配给flag->flag=null:(我没听懂,你能再解释一下吗。顺便说一下,这是你实施的正确方法。
PerformNetworkRequest3 performNetworkRequest3 = new PerformNetworkRequest3(this, new PerformNetworkRequest3 .AsyncResponse() {
            @Override
            public void processFinish(Boolean output)
            {
                Toast.makeText(MainActivity.this, "OUTPUT " + output, Toast.LENGTH_SHORT).show();
            }
        });
        performNetworkRequest3.execute("url", "hash_map", "requestCode");