2012-03-31 48 views
0

我是一个相对较新的Android开发人员,我无法理解如何执行此操作。我一直在研究所有的论坛,我做了一些进步,但仍然在这里。 因此,我想要做的是将POST请求发送到网页(它只发送一个POST参数)并将结果作为字符串返回的常用函数。 我这里的主线程用异步发送HttpPost并获取字符串结果

public class AppActivity extends Activity { 
    HTTPPostData PostData = new HTTPPostData("id"); 
    PostData.execute(); 
    txtLabel.setText(PostData.Result); 
} 

,我有我的HTTPPostData异步类

public class HTTPPostData extends AsyncTask<String, Long, Object> { 
String Value = null; 
String Result = null; 

public HTTPPostData(String query) { 
    Value = query; 
    } 

@Override 
protected String doInBackground(String... params) { 
    byte[] Bresult = null; 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("http://www.mypage.com/script.php"); 
     try { 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
     nameValuePairs.add(new BasicNameValuePair("cmd", Value)); 
      post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); 
      HttpResponse response = client.execute(post); 
      StatusLine statusLine = response.getStatusLine(); 
      if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){ 
       Bresult = EntityUtils.toByteArray(response.getEntity()); 
       Result = new String(Bresult, "UTF-8"); 
      } 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
     } 
     return Result; 
    } 
} 

我想要使用此功能几次(同一个活动中或以相同的其他活动分享应用)。我现在有点混乱,所以我需要你的帮助。我的理解是,我在doInBackground()完成之前要求结果,并且得到一个空的结果。

在此先感谢您的帮助

回答

1

对此:

HTTPPostData PostData = new HTTPPostData("id"); 
PostData.execute(); 
txtLabel.setText(PostData.Result); 

你的问题是,你正在处理的AsyncTask喜欢它只是一个普通的功能。将网页加载从主线程移出是一件好事,但如果您依赖于下一条指令的结果,那么它不会对您有所帮助,您仍然阻止主程序等待结果。你需要把AsyncTask看作是一个'忘记'的操作,在这个操作中你不知道它会在什么时候回来。

更好的东西在这里做会是这样的:

HTTPPostData PostData = new HTTPPostData("id"); 
PostData.execute(); 
txtLabel.setText("Loading..."); 

,然后在的AsyncTask:

protected void onPostExecute(String result) { 
    txtLabel.setText(result); 
} 

这可以让你的主线程得到与做它的业务不知道结果的asynctask,然后一旦数据可用,asynctask将填充文本标签和结果。

+0

我更喜欢在应用程序的不同情况下拥有一个公共类,但现在我发现我必须为每个类创建一个异步类。例如,如果我想获取一个数字,然后将其与存储在SharedPrefferences中的其他数据进行比较,然后获取一个字符串并将其显示在某个TextView上,则必须为这些操作中的每一个创建一个单独的类,其中包含几乎相同的代码。正如我所想的,异步类不能创建两次。 – ali 2012-03-31 21:25:18

+0

@ali我会把所有的Http-to-String的东西放到一个常用的实用函数中,然后为每个你想获得互联网数据的地方创建一个准系统AsyncTask,它只是调用你的通用函数,然后描述你的回调结果想在onPostExecute。它可能感觉被浪费了创造多种asynctask,但他们每个人都必须执行不同的回调。也许有一个更清洁的方式,但我不确定。也许你可以创建一个抽象的asynctask类,然后覆盖你想要使用它的每个地方的onPostExecute。 – Tim 2012-03-31 21:51:06

+0

这就是我所做的。谢谢! – ali 2012-04-03 17:04:42

相关问题