Java 在Android中使用多个类之间的Http响应? 类XXX实现可运行 { 字符串lat、lon、str、taluka_名称; int名称; HttpResponse响应; http实体; InputStream=null; 吐司s1; StringBuilder sb=null; 文本视图v; 纺纱机; 公共字符串结果[]; 文本视图电视; 线性布局ll1; int i; ArrayList croplist; 公共XXX(字符串t\n、字符串[]res、线性布局ll、文本视图tv1) { croplist=新的ArrayList(); taluka_name=t_n; 结果=res; ll1=ll; tv=tv1; } @凌驾 公开募捐{ //TODO自动生成的方法存根 HttpClient HttpClient=新的DefaultHttpClient(); HttpPost请求=新建HttpPost(“http://10.0.2.2/proagri115.php"); Listlogin=newarraylist(); 添加(新的BasicNameValuePair(“位置”,taluka_名称)); 尝试 { UrlEncodedFormEntity实体=新的UrlEncodedFormEntity(登录); 请求。设置实体(实体); } 捕获(不支持的编码异常e) { //TODO自动生成的捕捉块 e、 printStackTrace(); } 尝试 { response=httpclient.execute(请求); entity=response.getEntity(); is=entity.getContent(); System.out.println(“已执行请求”); } 捕获(客户端协议例外e) { //TODO自动生成的捕捉块 e、 printStackTrace(); } 捕获(IOE异常){ //TODO自动生成的捕捉块 e、 printStackTrace(); e、 printStackTrace(); System.out.println(“”); } 捕获(例外e) { } 试一试{ BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“iso-8859-1”),8; sb=新的StringBuilder(); sb.append(reader.readLine()+“\n”); 字符串行=“0”; 而((line=reader.readLine())!=null) { sb.追加(第+行“\n”); } is.close(); str=sb.toString(); Log.e(“Log_标记”,“成功转换结果”+sb.toString()); } 捕获(例外e) { Log.e(“Log_标记”,“错误转换结果”+e.toString()); System.out.println(str+“我已经执行”); 结果=str.split(“>>”); System.out.println(“长度”+结果长度); 对于(i=0;i
,您至少需要使用Thread.join来等待线程完成..但这会阻塞您的UI线程,这是非常糟糕的。您应该使用android方式并使用异步任务来执行此操作 请阅读以下内容: 以下是您应该做的:Java 在Android中使用多个类之间的Http响应? 类XXX实现可运行 { 字符串lat、lon、str、taluka_名称; int名称; HttpResponse响应; http实体; InputStream=null; 吐司s1; StringBuilder sb=null; 文本视图v; 纺纱机; 公共字符串结果[]; 文本视图电视; 线性布局ll1; int i; ArrayList croplist; 公共XXX(字符串t\n、字符串[]res、线性布局ll、文本视图tv1) { croplist=新的ArrayList(); taluka_name=t_n; 结果=res; ll1=ll; tv=tv1; } @凌驾 公开募捐{ //TODO自动生成的方法存根 HttpClient HttpClient=新的DefaultHttpClient(); HttpPost请求=新建HttpPost(“http://10.0.2.2/proagri115.php"); Listlogin=newarraylist(); 添加(新的BasicNameValuePair(“位置”,taluka_名称)); 尝试 { UrlEncodedFormEntity实体=新的UrlEncodedFormEntity(登录); 请求。设置实体(实体); } 捕获(不支持的编码异常e) { //TODO自动生成的捕捉块 e、 printStackTrace(); } 尝试 { response=httpclient.execute(请求); entity=response.getEntity(); is=entity.getContent(); System.out.println(“已执行请求”); } 捕获(客户端协议例外e) { //TODO自动生成的捕捉块 e、 printStackTrace(); } 捕获(IOE异常){ //TODO自动生成的捕捉块 e、 printStackTrace(); e、 printStackTrace(); System.out.println(“”); } 捕获(例外e) { } 试一试{ BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“iso-8859-1”),8; sb=新的StringBuilder(); sb.append(reader.readLine()+“\n”); 字符串行=“0”; 而((line=reader.readLine())!=null) { sb.追加(第+行“\n”); } is.close(); str=sb.toString(); Log.e(“Log_标记”,“成功转换结果”+sb.toString()); } 捕获(例外e) { Log.e(“Log_标记”,“错误转换结果”+e.toString()); System.out.println(str+“我已经执行”); 结果=str.split(“>>”); System.out.println(“长度”+结果长度); 对于(i=0;i,java,android,multithreading,httprequest,Java,Android,Multithreading,Httprequest,,您至少需要使用Thread.join来等待线程完成..但这会阻塞您的UI线程,这是非常糟糕的。您应该使用android方式并使用异步任务来执行此操作 请阅读以下内容: 以下是您应该做的: class XXX implements Runnable { String lat,lon,str,taluka_name; int name; HttpResponse response; HttpEntity entity; InputStream is = null; Toast s1; Stri
class XXX implements Runnable
{
String lat,lon,str,taluka_name;
int name;
HttpResponse response;
HttpEntity entity;
InputStream is = null;
Toast s1;
StringBuilder sb=null;
TextView v;
Spinner s;
public String result[];
TextView tv;
LinearLayout ll1;
int i;
ArrayList<Integer> croplist;
public XXX(String t_n,String [] res,LinearLayout ll,TextView tv1)
{
croplist= new ArrayList<Integer>();
taluka_name = t_n;
result = res;
ll1= ll;
tv = tv1;
}
@Override
public void run() {
// TODO Auto-generated method stub
HttpClient httpclient = new DefaultHttpClient();
HttpPost request = new HttpPost("http://10.0.2.2/proagri115.php");
List<NameValuePair>login=new ArrayList<NameValuePair>();
login.add(new BasicNameValuePair("location", taluka_name));
try
{
UrlEncodedFormEntity entity=new UrlEncodedFormEntity(login);
request.setEntity(entity);
}
catch (UnsupportedEncodingException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
response = httpclient.execute(request);
entity = response.getEntity();
is = entity.getContent();
System.out.println("Executed the request");
}
catch (ClientProtocolException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
e.printStackTrace();
System.out.println("");
}
catch(Exception e)
{
}
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line="0";
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
is.close();
str=sb.toString();
Log.e("log_tag", "Success converting result "+sb.toString());
}
catch(Exception e)
{
Log.e("log_tag", "Error converting result "+e.toString());
System.out.println(str+"I have executed");
result = str.split(">>");
System.out.println("length"+result.length);
for(i=0;i<result.length;i++)
{
System.out.println("\n"+i+"=="+result[i]);
}
System.out.println("Notified");
}
}
}
public class help extends Activity{
int j;
Intent i;
String s,taluka_name;
EditText edt,edt1,edt2;
Double lat,lon;
Spinner spin;
String [] re;
TextView tv;
Layout lt;
LinearLayout lt1;
XXX runnable;
public void onCreate(Bundle savedinstancestate)
{
super.onCreate(savedinstancestate);
setContentView(R.layout.help);
lt1 = (LinearLayout)findViewById(R.id.ll1);
s =(String)getIntent().getSerializableExtra("Rainfall");
taluka_name =(String)getIntent().getSerializableExtra("location");
System.out.println(s);
tv = new TextView(this);
tv.setText("Crops for Your Selected Area are");
lt1.addView(tv);
try
{
runnable = new XXX(taluka_name,re,lt1,tv);
Thread threadX = new Thread(runnable);
System.out.println("till this");
threadX.start();
System.out.println("In Waited");
try
{
wait(500);
}
catch (IllegalMonitorStateException e)
{
System.out.println("IllegalMonitorStateException");
}
catch (InterruptedException e)
{
System.out.println("InterruptedException");
}
System.out.println("Out of Waited");
}
catch(Exception e)
{
System.out.println("Error again "+e);
}
try{
System.out.println("Final Result will be");
for(j=0;j<runnable.result.length;j++)
{
tv = new TextView(this);
tv.setText(runnable.result[j]);
System.out.println(runnable.result[j]);
lt1.addView(tv);
}
}
catch(Exception e)
{
}
}
}
现在棘手的事情是,您需要将结果返回到UI线程。最简单的方法是将AsyncTask作为内部类放在活动中,然后在AsyncTask的onPostExecute中,您只需从活动中调用一些函数。
如果希望AsyncTask位于单独的文件中,则需要将类的引用传递给AsyncTask的构造函数,然后可以从AsyncTask调用活动的任何公共方法。请记住,只能在onPostExecute和onProgressUpdate中调用activities方法(不要在doInBackground中调用UI方法)当两个线程需要协作和交换信息时,应该使用同步机制 当HTTP请求在后台线程中完成时,您可以使用将操作发回UI线程,或者更好地在中执行后台工作 以下是一个一般示例:
new XXX(taluka_name,re,lt1,tv).execute();
将参数(类型为
Param
)传递给execute()
。请注意,这必须在UI线程中完成。不,这与logcat无关,因为没有错误。它只是在线程XXX完成其操作之前执行main方法,因此我无法在主活动中的线程上使用http响应。您试图在主活动中使用线程结果做什么?更新一些控件?在http响应中e我从数据库中获取一些农作物列表,通过添加主要活动的文本视图显示农作物列表。如果有人知道答案,请快速回复。忘记线程,使用AsyncTask
。我将在一分钟内更新我的答案,告诉您如何获取代码并将其设置为AsyncTask
new XXX(taluka_name,re,lt1,tv).execute();
private class AsyncTaskExample extends AsyncTask<Param, Progress, Result> {
@Override
protected Result doInBackground(Param... params) {
// Performs some computation in a background thread.
// Use publishProgress() to publish progress updates which
// will take place in the UI thread in onProgressUpdate().
return ...;
}
@Override
protected void onProgressUpdate(Progress... progress) {
// Update progress information. Run in the UI thread.
}
@Override
protected void onPostExecute(Result result) {
// Update on completion. Run in the UI thread.
}
}
new AsyncTaskExample().execute(param1, param2, ...);