在异步任务中使用外部类变量

时间:2014-01-06 18:25:23

标签: java android android-asynctask

我对使用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

5 个答案:

答案 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]);