【问题标题】:How to access a public variable in the outer class from an asynctask in Java?如何从 Java 中的异步任务访问外部类中的公共变量?
【发布时间】:2015-03-11 16:21:04
【问题描述】:

我正在编写一个 android 应用程序,它应该使用另一个线程中的 httpclient 连接到我的网络服务器。我想在 asynctask 中使用我的 mainactivity 类中的变量,以便 httpclient 可以将这些发布到我的服务器。当我在异步任务中使用公共变量时,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;
        }
    }
}

【问题讨论】:

    标签: java android android-asynctask http-post apache-httpclient-4.x


    【解决方案1】:

    标准做法是将它们传递到 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;
        }
    

    【讨论】:

    • 感谢您的回答。不幸的是,这对我不起作用,该应用程序仍然向服务器发布一个空值。似乎变量设置正确,当我在 doInBackground void 中运行 DoRequest 代码并将返回变量设置为 pHosturl 时,它返回 pHosturl。但是,当我尝试发布这些变量时,它们都是空的。
    • 嗯,尝试添加日志记录以确保在每个阶段填充变量。您也可以发布更新后的代码吗?
    • 嗨,我更新了我的问题,见上文。我在代码中创建了一些日志函数。调试时它说它们都已设置好。所以我认为错误出在namevaluepair中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多