gpt4 book ai didi

java - 如何从Java中的asynctask访问外部类中的公共(public)变量?

转载 作者:行者123 更新时间:2023-12-01 22:24:52 25 4
gpt4 key购买 nike

我正在编写一个 Android 应用程序,它应该在另一个线程中使用 httpclient 连接到我的网络服务器。我想在 asynctask 中使用 mainactivity 类中的变量,以便 httpclient 可以将这些变量发布到我的服务器。当我在异步任务中使用公共(public)变量时,httppostmethod 会发布空值。

这是我更新的代码,我现在可以检索 asynctask 参数,但是当我尝试在向服务器发布的帖子中使用它们时,它仍然发布空字符串。只有当我用硬编码字符串替换变量 pHosturl、pUsername 和 pPassword 时,它才能工作并且正确发布。

public class MainActivity extends ActionBarActivity {
private AlertDialog alertDialog;
public String pHosturl;
public String pUsername;
public String pPassword;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AlertDialog.Builder Alertbuilder = new AlertDialog.Builder(this);
Alertbuilder.setPositiveButton("Okay", null);
alertDialog = Alertbuilder.create();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

pHosturl = GetFileContentString("set1.txt");
pPassword = GetFileContentString("set2.txt");
pUsername = GetFileContentString("set3.txt");

//These files are created in another part of the program and they contain a string value

}

public void ViewData(View v){
HttpAsyncTask task = new HttpAsyncTask();
task.execute(pHosturl, pUsername, pPassword);

}

private class HttpAsyncTask extends AsyncTask<String, Boolean, String> {

@Override
protected String doInBackground(String... params) {
String pHosturl = params[0];
String pUsername = params[1];
String pPassword = params[2];
Log.i("MyApp", "url: " + pHosturl + " username: " + pUsername + " password: " + pPassword);
String Response = "";
try {
Log.i("MyApp", "url: " + pHosturl + " username: " + pUsername + " password: " + pPassword);
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://localhost/OnlineApi/GetCookie.aspx");
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(3);
nameValuePair.add(new BasicNameValuePair("sessurl", pHosturl));
nameValuePair.add(new BasicNameValuePair("usn", pUsername));
nameValuePair.add(new BasicNameValuePair("pass", pPassword));
Log.i("MyApp", "url: " + pHosturl + " username: " + pUsername + " password: " + pPassword);
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
HttpResponse response = httpClient.execute(httpPost);
HttpEntity responseEntity = response.getEntity();
Response = EntityUtils.toString(responseEntity);
} catch (Exception e) {

}
return Response;
}

@Override
protected void onPostExecute(String s) {
alertDialog.setTitle("Alert");
alertDialog.setMessage(s);
alertDialog.show();
}

}


public String GetFileContentString(String FileName) {
String RetString = "";
try {
InputStream in = openFileInput(FileName);

if (in != null) {
InputStreamReader tmp = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(tmp);
String str;
StringBuilder buf = new StringBuilder();

while ((str = reader.readLine()) != null) {
buf.append(str + "\n");
}
RetString = buf.toString();
in.close();
}
} catch (Exception e) {
RetString = "";
}
return RetString;
}
}
}

最佳答案

标准做法是将它们传递到 AsyncTask 的参数中。看起来你想要这样的东西:

public void ViewData(View v) {
HttpAsyncTask task = new HttpAsyncTask();

Log.d("MyApp", "url: " + pHosturl + " username: " + pUsername + " password: " + pPassword);

task.execute(pHosturl, pUsername, pPassword);


}

private class HttpAsyncTask extends AsyncTask<String, Boolean, String> {
@Override
protected String doInBackground(String... params) {
String pHosturl = params[0];
String pUsername = params[1];
String pPassword = params[2];

Log.d("MyApp", "url: " + pHosturl + " username: " + pUsername + " password: " + pPassword);


String Response = "";
try {
Response = DoRequest(pHosturl, pUsername, pPassword);
} catch (Exception e) {

}
return Response;
}

@Override
protected void onPostExecute(String s) {
alertDialog.setTitle("Alert");
alertDialog.setMessage(s);
alertDialog.show();
}

public String DoRequest(String pHosturl, String pUsername, String pPassword) throws Exception {

Log.d("MyApp", "url: " + pHosturl + " username: " + pUsername + " password: " + pPassword);

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://localhost/OnlineApi/ GetCookie.aspx");
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(3);
nameValuePair.add(new BasicNameValuePair("sessurl", pHosturl));
nameValuePair.add(new BasicNameValuePair("usn", pUsername));
nameValuePair.add(new BasicNameValuePair("pass", pPassword));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
HttpResponse response = httpClient.execute(httpPost);
HttpEntity responseEntity = response.getEntity();
String ResponseString = EntityUtils.toString(responseEntity);
return ResponseString;
}

关于java - 如何从Java中的asynctask访问外部类中的公共(public)变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28991980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com