Java 从主活动调用AsyncTask时获取异常
当从主活动调用AsyncTask时,我遇到异常 在函数下面,我调用名为“serverConnectorTask”的AsyncTask类 在jsonResponse变量中,我需要获得从asynctask获得的响应Java 从主活动调用AsyncTask时获取异常,java,android,android-asynctask,Java,Android,Android Asynctask,当从主活动调用AsyncTask时,我遇到异常 在函数下面,我调用名为“serverConnectorTask”的AsyncTask类 在jsonResponse变量中,我需要获得从asynctask获得的响应 public void CreateJsonConnectNParseResponse(String stringtxtUserName, String hashedPwd ){ jsonRequest = CONNECTOR.CreateJsonRequestLoginA
public void CreateJsonConnectNParseResponse(String stringtxtUserName, String hashedPwd ){
jsonRequest = CONNECTOR.CreateJsonRequestLoginAction(stringtxtUserName,hashedPwd);
Log.d("LoginJsonRequest", jsonRequest);
//jsonResponse = CONNECTOR.jsonServerRequest(jsonRequest,ipaddress);
MyAsyncTask serverConnectorTask= new MyAsyncTask(getApplicationContext(),"ServerConnectorTask");
serverConnectorTask.execute(jsonRequest);
Log.d("JSON_SERVER_REQUEST", "SERVER REQUEST aftr task " );
jsonResponse=serverConnectorTask.jsonResult;
Log.d("JSON_SERVER_REQUEST", jsonResponse);
}
我的serverConnectorTask类如下所示:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
public class MyAsyncTask extends AsyncTask<String, Void, String>{
Context context;
private String name;
public HttpClient httpclient = new DefaultHttpClient();
public HttpPost httppost;
public static String ipaddress;
public static String deviceID;
public String jsonResult = null ;
public ProgressDialog Dialog;
public MyAsyncTask(Context mcontext,String name) {
context = mcontext;
this.name = name;
this.jsonResult=null;
Log.d("JSON_SERVER_REQUEST", "SERVER REQUEST FUNCTION ENTERED 1" );
}
protected void onPreExecute() {
// NOTE: You can call UI Element here.
//Start Progress Dialog (Message)
Log.d("JSON_SERVER_REQUEST", "SERVER REQUEST FUNCTION ENTERED 2" );
}
// Call after onPreExecute method
@Override
protected String doInBackground(String... jsonrequest) {
/************ Make Post Call To Web Server ***********/
Log.d("JSON_SERVER_REQUEST", "SERVER REQUEST FUNCTION ENTERED " );
//String uri = "http://192.168.2.58:888/root/Calculator.Add";
String uri=MainActivity.ipaddress;
httppost = new HttpPost(uri);
try {
Log.d("JSON_SERVER_REQUEST", "SERVER REQUEST FUNCTION ENTERED IN TRY CATCH" );
StringEntity se = new StringEntity(jsonrequest[0]);
se.setContentType("application/json; charset=UTF-8");
//se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json; charset=UTF-8"));
httppost.setEntity(se);
httppost.setHeader("Accept", "application/json, text/javascript, */*");
httppost.setHeader("Content-Type", "application/json; charset=utf-8");
//httppost.setHeader("Keep-Alive", "true");
HttpResponse response = httpclient.execute(httppost);
jsonResult = inputStreamToString(response.getEntity().getContent()).toString();
Log.d("JSON_SERVER_REQUEST", jsonResult );
}
catch (ClientProtocolException e) {
e.printStackTrace();
Log.d("JSON_SERVER_REQUEST_CATCH", "Error in http connection " + e.toString());
return null;
}
catch (IOException e) {
e.printStackTrace();
Log.d("JSON_SERVER_REQUEST_CATCH", "Error in http connection " + e.toString());
return null;
}
/*****************************************************/
return jsonResult;
}
@Override
protected void onPostExecute(String result) {
// NOTE: You can call UI Element here.
Log.d("JSON_SERVER_REQUEST", "SERVER REQUEST onpost execute " +result);
//showMessage(jsonResult) ;
//Log.d("JSON_SERVER_REQUEST", "SERVER REQUEST onpost execute " );
this.jsonResult=result;
}
private void showMessage(String message) {
Toast toast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
toast.show();
}
private StringBuilder inputStreamToString(InputStream is) {
String rLine = "";
StringBuilder jsonServerData = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((rLine = rd.readLine()) != null) {
jsonServerData.append(rLine);
}
}
catch (IOException e) {
e.printStackTrace();
}
//Log.d("jsonresponse from server:", jsonServerData.toString());
return jsonServerData;
}
}
使用如下线程:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
//do
}
}.start();
在方法
CreateJsonConnectNParseResponse
换行
Log.d("JSON_SERVER_REQUEST", jsonResponse);
像这样
Log.d("JSON_SERVER_REQUEST", "" + jsonResponse);
我想这只是修复了您当前存在的NullPointerException,您可能会遇到更多问题。让我们逐一修复它们。根据文档 您需要将字符串参数传递给log.d方法。变量jsonResponse可能为null。
在传递log.d方法之前,确保将json响应转换为字符串这一行可能会给出错误
log.d(“json\u服务器请求”,jsonResponse)代码>这是因为您正在尝试使用空值打印日志。请尝试初始化变量。
例如:String jsonResponse=“”代码>我通过serverConnectorTask.execute(jsonRequest).get()解决了这个问题,它将使进程等待ie在必要时等待计算完成,然后检索其结果
MyAsyncTask serverConnectorTask= new MyAsyncTask(MainActivity.this,MainActivity.this,"ServerConnectorTask");
//serverConnectorTask.execute(jsonRequest);
try {
jsonResponse=serverConnectorTask.execute(jsonRequest).get();
} catch (InterruptedException e5) {
// TODO Auto-generated catch block
e5.printStackTrace();
} catch (ExecutionException e5) {
// TODO Auto-generated catch block
e5.printStackTrace();
}
Log.d("JSON_SERVER_REQUEST", "SERVER REQUEST aftr task "+jsonResponse );
您的解决方案可能已解决异常,但您仍需等待,用户可能会注意到应用程序没有响应。如果请求耗时超过5秒,Android将只显示“应用程序未响应”警报
当您需要从异步任务获取数据时,可以使用以下解决方案:
使用接口:
public interface INeedDataBack {
public void dataIsReady(String data);
}
在活动中实现该接口:
... Activity implements INeedDataBack {
...
public void dataIsReady(String response) {
Log.d("JSON_SERVER_REQUEST", response);
}
...
}
调整任务如下:
而不是
语境代码>使用内置数据背景代码>
在您的onPostExecute
中:
(INeedDataBack)上下文。数据已就绪(结果)
将数据传递给活动
应该是这样。您(在代码中)从哪里得到错误?jsonResonse是一个字符串,因此不需要连接,当我这样尝试时:serverConnectorTask.execute(jsonRequest);Log.d(“JSON_服务器请求”、“服务器请求aftr任务”);jsonResponse=serverConnectorTask.jsonResult;如果(jsonResponse!=null){Log.d(“JSON_服务器_请求,jsonResponse);}没有期望,但我不会在CreateJsonConnectNParseResponse()中获取jsonResponse的值。当jsonResponse
为null时,就会发生NullPointerException。通过将其与空字符串连接,可以确保它永远不会发生。让我们来看看为什么不能从AsyncTask中获取值。我已经初始化了变量,问题是我不是从MyAsyncTask类到我的CreateJsonConnectNParseResponse()函数获取jsonResponse值的人。在MyAsyncTask中,我能够获得值,但由于MyAsyncTask滞后,当我调用jsonResponse=serverConnectorTask.jsonResult时,我无法获得值;因此,我需要知道线程是否完成,以便调用jsonResponse=serverConnectorTask.jsonResult;怎么做?有什么想法吗?我已经初始化了变量,问题是我不是从MyAsyncTask类到我的CreateJsonConnectNParseResponse()函数获取jsonResponse值的人。在MyAsyncTask中,我能够获得值,但由于MyAsyncTask滞后,当我调用jsonResponse=serverConnectorTask.jsonResult时,我无法获得值;因此,我需要知道线程是否完成,以便调用jsonResponse=serverConnectorTask.jsonResult;如何做??有什么想法吗?我通过这样做解决了:MyAsyncTask serverConnectorTask=new MyAsyncTask(MainActivity.this,MainActivity.this,“serverConnectorTask”);//serverConnectorTask.execute(jsonRequest);尝试{jsonResponse=serverConnectorTask.execute(jsonRequest.get();}catch(interruptedeexception e5){//TODO自动生成的catch块e5.printStackTrace();}catch(ExecutionException e5){//TODO自动生成的catch块e5.printStackTrace();}Log.d(“JSON_服务器_请求”,“服务器请求aftr任务”+jsonResponse);是的,我已经做了,但忘了用我的答案发布这个!
... Activity implements INeedDataBack {
...
public void dataIsReady(String response) {
Log.d("JSON_SERVER_REQUEST", response);
}
...
}