Android 从onPostExecute到OnCreateView获取JSON字符串
我需要从onPostExecute(异步任务)获取var s(commnet)到onCreatView(以便绘制图表)。 这是我的代码: 我尝试了很多解决方案,但我做不到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
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");