我对使用AsyncTask(以及一般的Java)相当新,所以如果我这是一个菜鸟问题,我很抱歉。
我正在尝试在我的主类中的异步类中使用类字符串。我希望我能正确解释。
基本上,我需要在我的异步任务中使用字符串url5
。我尝试将它放入PreExecute但它无法识别它。我也尝试将它直接放入doInBackground。它不允许我将字符串设置为类内的公共静态。它允许我在课外进行,但仍然无法被异步任务识别。
不知道还有什么可以尝试。
这是我的代码:
public class NewHomepage extends Activity {
public static String url = "http://www.mywebsite.com/android/SQL.php?username=";
public static String usernamefromlogin;
public static TextView errorchecking;
public static JSONArray user = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.reshomepage);
//get data from previous screen
Intent intent = getIntent();
getIntent().getExtras();
//convert intent (intent) to string called "usernamefromlogin" //error checking in log cat to see value of "usernamefromlogin"
usernamefromlogin = intent.getExtras().getString("username2"); Log.d("log usernamefromlogin", usernamefromlogin);
//take the string "url" and add string "usernamefromlogin" after it //error checking in log cat to see value of url5
String url5 = url.concat(usernamefromlogin); Log.d("log url5", url5);
//start asynch task
class PostTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}//end PreExecute
@Override
protected String doInBackground(String... params) {
return null;
// Creating new JSON Parser
JSONParser jParser = new JSONParser();
// Getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(url5);
}//end doInBackground
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}//end onProgressUpdate
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}//end onPostExecute
}//end Async task
//execute the Async task
PostTask task=new PostTask();
task.execute();
}
@Override
public void onBackPressed() {
// do nothing on back press do nothing
}
}//end class
答案 0 :(得分:2)
最简单的方法是将url5变量设置为全局,使其可以被AsyncTask访问,但是将变量传递给AsyncTasks的正确方法是在调用execute命令时将它们作为参数传递
new PostTask()。execute(url5);
并在doInBackgroud中使用该参数
@Override
protected String doInBackground(String... params) {
return null;
String url5 = params[0];
// Creating new JSON Parser
JSONParser jParser = new JSONParser();
// Getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(url5);
}//end doInBackground
答案 1 :(得分:0)
将String url5设为全局,或者在async任务中初始化它,如this-
class PostTask extends AsyncTask<String, String, String>
{
String url5 = url.concat(usernamefromlogin);
// your other methods
}
答案 2 :(得分:0)
以这种方式更改您的代码 -
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class NewHomepage extends Activity {
public static String url = "http://www.mywebsite.com/android/SQL.php?username=";
public static String usernamefromlogin;
public static TextView errorchecking;
public static JSONArray user = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.reshomepage);
//get data from previous screen
Intent intent = getIntent();
getIntent().getExtras();
//convert intent (intent) to string called "usernamefromlogin"
//error checking in log cat to see value of "usernamefromlogin"
usernamefromlogin = intent.getExtras().getString("username2");
Log.d("log usernamefromlogin", usernamefromlogin);
//take the string "url" and add string "usernamefromlogin" after it
//error checking in log cat to see value of url5
String url5 = url.concat(usernamefromlogin);
Log.d("log url5", url5);
//execute the Async task
PostTask task=new PostTask();
task.execute(url5);
}
@Override
public void onBackPressed() {
// do nothing on back press do nothing
}
//start asynch task
class PostTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}//end PreExecute
@Override
protected String doInBackground(String... url5) {
// Creating new JSON Parser
JSONParser jParser = new JSONParser();
// Getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(url5);
return null;
}//end doInBackground
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}//end onProgressUpdate
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}//end onPostExecute
}//end Async task
}//end class
答案 3 :(得分:0)
对于初学者来说,你的语法是错误的。应该在onCreate(...)
方法之外声明AsyncTask。其次,关于你的AsyncTask
,该类提供了一种非常简单的方法来将数据传递给它。请注意doInBackground(...)
如何使用参数String... params
。这意味着您可以将字符串传递给它。当您在任务上调用execute(...)
时,您可以传递无限数量的字符串作为参数。例如,
PostTask task = new PostTask();
task.execute(url5);
然后,在doInBackground(...)
中,使用它来检索参数:
String url = params[0];
希望这有帮助!
答案 4 :(得分:0)
//get data from previous screen
Intent intent = getIntent();
getIntent().getExtras();
首先,第二行代码没有做任何事情。 getIntent(()。getExtras()的返回不会分配给变量。
第二关,为什么url5需要成为公共静态? AsyncTask,因为它在不同的线程上运行,不能保证变量在那里。从OOP的角度来看,您应该将URL传递给AsyncTask构造函数,如:
//execute the Async task
PostTask task=new PostTask();
task.execute(url5);
最后,doInBackground接受一个数组(params)而不是String。所以你需要把它改成:
@Override
protected String doInBackground(String... params) {
...
// Getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(params[0]);