从内部访问私有变量 class (AsyncTask)
Access private variable from inner class (AsyncTask)
我有问题,我正在尝试从 AsyncTask
的 doInBackground
方法访问外部 class 的私有变量,该方法是内部 class .这里有完整的代码。
public class MessageHandler {
private Contact receiver;
private String senderFacebookId;
private String message;
private final String TAG = "MessageHandler";
private Context context;
boolean sentResult;
public MessageHandler(Contact receiver, String senderFacebookId, String message, Context context) {
this.receiver = receiver;
this.senderFacebookId = senderFacebookId;
this.message = message;
this.context=context;
this.sentResult = false;
}
public void send(){
Log.i(TAG, "Sending message to " + receiver.getName() + " receiver id: " + receiver.getFacebook_id() + " sender id: " + senderFacebookId + " message: " + message);
new SenderAsync().execute(senderFacebookId,message, receiver.getFacebook_id());
if(this.sentResult==true){
Toast toast = Toast.makeText(this.context, "Message Sent", Toast.LENGTH_LONG);
toast.show();
}else{
Toast toast = Toast.makeText(this.context, "ERROR: Message not Sent", Toast.LENGTH_LONG);
toast.show();
}
}
private class SenderAsync extends AsyncTask<String,String,String> {
@Override
protected void onPreExecute(){
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected String doInBackground(String... params) {
HttpClient client = new DefaultHttpClient();
try {
List<NameValuePair> parameter = new ArrayList<>(1);
parameter.add(new BasicNameValuePair("regId", "empty"));
parameter.add(new BasicNameValuePair("sender_id", params[0]));
parameter.add(new BasicNameValuePair("receiver_facebook_id", params[2]));
parameter.add(new BasicNameValuePair("message", params[1]));
String paramString = URLEncodedUtils.format(parameter, "utf-8");
HttpGet get = new HttpGet(ProfileFragment.SERVER_URL_SEND_MESSAGE+"?"+paramString);
Log.i(TAG, paramString);
HttpResponse resp = client.execute(get);
System.out.println("SREVER RESPONSE " + resp.getStatusLine().getStatusCode());
//THIS IS THE VARIABLE THAT I WANT TO ACCESS
if(resp.getStatusLine().getStatusCode()==200){
MessageHandler.this.sentResult = true;
}
} catch (IOException e) {
Log.i(TAG,"Error :" + e.getMessage());
}
return null;
}
}
}
我试图访问的变量是布尔变量sentResult
。我还打印出始终为 200 的服务器的响应。即使我删除了 if 条件并将它设置为 true 在任何情况下,看起来那行代码从未执行并且未访问变量,所以它总是错误的。
为 SenderAsync 创建构造函数;
public SenderAsync(上下文上下文,字符串发送者 ID,字符串消息,联系接收者)
这样称呼它;
new SenderAsync(senderFacebookId,message, receiver.getFacebook_id()).execute();
并且您需要在 onPostExecute 中获取结果。
void onPostExecute(字符串返回值)
{
// 运行 这里是你想要的 if 语句
}
异步任务的全部意义在于它是异步的。如果您执行一个任务,您将不会在下一行代码中得到结果。为了评估结果,您应该使用 onPostExecute
回调方法。
@Override
protected void onPostExecute(String s) {
if(sentResult==true){
Toast toast = Toast.makeText(this.context, "Message Sent", Toast.LENGTH_LONG);
toast.show();
}else{
Toast toast = Toast.makeText(this.context, "ERROR: Message not Sent", Toast.LENGTH_LONG);
toast.show();
}
}
此外,如果您要更改方法签名,您甚至不需要外部变量。
private class SenderAsync extends AsyncTask<String,String,Boolean> {
@Override
protected void onPostExecute(Boolean sent) {
if(sent == true){
Toast toast = Toast.makeText(this.context, "Message Sent", Toast.LENGTH_LONG);
toast.show();
}else{
Toast toast = Toast.makeText(this.context, "ERROR: Message not Sent", Toast.LENGTH_LONG);
toast.show();
}
}
@Override
protected Boolean doInBackground(String... params) {
try {
...
if (resp.getStatusLine().getStatusCode() == 200) {
return true;
}
}
catch (IOException e) {
}
return false;
}
您正在尝试在告诉 AsyncTask 完成其工作后立即验证 sentResult
。 AsyncTask 在单独的线程上并行执行它必须执行的操作。所以在它完成之前,sentResult
是不变的。
我的建议是将您的 Toast 逻辑放在 onPostExecute 中。
您没有正确使用 AsyncTask。 AsyncTask 应该 return 结果 onPostExecute() 并且你的 UI 应该有一个单独的方法 onPostExecute() 调用(因此异步名称)。对于你想要完成的事情,你应该这样做:
public void send() {
new SenderAsync().execute(senderFacebookId,message, receiver.getFacebook_id());
}
public void processResult(boolean result) {
String resultMsg = result ? "Message Sent" : "ERROR: Message not Sent";
Toast.makeText(this.context, resultMsg, Toast.LENGTH_LONG).show();
}
private class SenderAsync extends AsyncTask<String, String, Boolean> {
...
@Override
protected String doInBackground(String... params) {
...
try {
...
return (resp.getStatusLine().getStatusCode() == 200)
}
...
return false;
}
@Override
protected void onPostExecute(Boolean result) {
processResult(result);
}
}
我有问题,我正在尝试从 AsyncTask
的 doInBackground
方法访问外部 class 的私有变量,该方法是内部 class .这里有完整的代码。
public class MessageHandler {
private Contact receiver;
private String senderFacebookId;
private String message;
private final String TAG = "MessageHandler";
private Context context;
boolean sentResult;
public MessageHandler(Contact receiver, String senderFacebookId, String message, Context context) {
this.receiver = receiver;
this.senderFacebookId = senderFacebookId;
this.message = message;
this.context=context;
this.sentResult = false;
}
public void send(){
Log.i(TAG, "Sending message to " + receiver.getName() + " receiver id: " + receiver.getFacebook_id() + " sender id: " + senderFacebookId + " message: " + message);
new SenderAsync().execute(senderFacebookId,message, receiver.getFacebook_id());
if(this.sentResult==true){
Toast toast = Toast.makeText(this.context, "Message Sent", Toast.LENGTH_LONG);
toast.show();
}else{
Toast toast = Toast.makeText(this.context, "ERROR: Message not Sent", Toast.LENGTH_LONG);
toast.show();
}
}
private class SenderAsync extends AsyncTask<String,String,String> {
@Override
protected void onPreExecute(){
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected String doInBackground(String... params) {
HttpClient client = new DefaultHttpClient();
try {
List<NameValuePair> parameter = new ArrayList<>(1);
parameter.add(new BasicNameValuePair("regId", "empty"));
parameter.add(new BasicNameValuePair("sender_id", params[0]));
parameter.add(new BasicNameValuePair("receiver_facebook_id", params[2]));
parameter.add(new BasicNameValuePair("message", params[1]));
String paramString = URLEncodedUtils.format(parameter, "utf-8");
HttpGet get = new HttpGet(ProfileFragment.SERVER_URL_SEND_MESSAGE+"?"+paramString);
Log.i(TAG, paramString);
HttpResponse resp = client.execute(get);
System.out.println("SREVER RESPONSE " + resp.getStatusLine().getStatusCode());
//THIS IS THE VARIABLE THAT I WANT TO ACCESS
if(resp.getStatusLine().getStatusCode()==200){
MessageHandler.this.sentResult = true;
}
} catch (IOException e) {
Log.i(TAG,"Error :" + e.getMessage());
}
return null;
}
}
}
我试图访问的变量是布尔变量sentResult
。我还打印出始终为 200 的服务器的响应。即使我删除了 if 条件并将它设置为 true 在任何情况下,看起来那行代码从未执行并且未访问变量,所以它总是错误的。
为 SenderAsync 创建构造函数;
public SenderAsync(上下文上下文,字符串发送者 ID,字符串消息,联系接收者)
这样称呼它;
new SenderAsync(senderFacebookId,message, receiver.getFacebook_id()).execute();
并且您需要在 onPostExecute 中获取结果。 void onPostExecute(字符串返回值) { // 运行 这里是你想要的 if 语句 }
异步任务的全部意义在于它是异步的。如果您执行一个任务,您将不会在下一行代码中得到结果。为了评估结果,您应该使用 onPostExecute
回调方法。
@Override
protected void onPostExecute(String s) {
if(sentResult==true){
Toast toast = Toast.makeText(this.context, "Message Sent", Toast.LENGTH_LONG);
toast.show();
}else{
Toast toast = Toast.makeText(this.context, "ERROR: Message not Sent", Toast.LENGTH_LONG);
toast.show();
}
}
此外,如果您要更改方法签名,您甚至不需要外部变量。
private class SenderAsync extends AsyncTask<String,String,Boolean> {
@Override
protected void onPostExecute(Boolean sent) {
if(sent == true){
Toast toast = Toast.makeText(this.context, "Message Sent", Toast.LENGTH_LONG);
toast.show();
}else{
Toast toast = Toast.makeText(this.context, "ERROR: Message not Sent", Toast.LENGTH_LONG);
toast.show();
}
}
@Override
protected Boolean doInBackground(String... params) {
try {
...
if (resp.getStatusLine().getStatusCode() == 200) {
return true;
}
}
catch (IOException e) {
}
return false;
}
您正在尝试在告诉 AsyncTask 完成其工作后立即验证 sentResult
。 AsyncTask 在单独的线程上并行执行它必须执行的操作。所以在它完成之前,sentResult
是不变的。
我的建议是将您的 Toast 逻辑放在 onPostExecute 中。
您没有正确使用 AsyncTask。 AsyncTask 应该 return 结果 onPostExecute() 并且你的 UI 应该有一个单独的方法 onPostExecute() 调用(因此异步名称)。对于你想要完成的事情,你应该这样做:
public void send() {
new SenderAsync().execute(senderFacebookId,message, receiver.getFacebook_id());
}
public void processResult(boolean result) {
String resultMsg = result ? "Message Sent" : "ERROR: Message not Sent";
Toast.makeText(this.context, resultMsg, Toast.LENGTH_LONG).show();
}
private class SenderAsync extends AsyncTask<String, String, Boolean> {
...
@Override
protected String doInBackground(String... params) {
...
try {
...
return (resp.getStatusLine().getStatusCode() == 200)
}
...
return false;
}
@Override
protected void onPostExecute(Boolean result) {
processResult(result);
}
}