我想实现登录活动。它通过网络服务检查用户是否存在。
EditText un=(EditText) findViewById(R.id.txtName);
EditText pass=(EditText) findViewById(R.id.txtPass);
WS ss=new WS();
String str=ss.execute("checkLogin",un.getText().toString(),pass.getText().toString()).get();
Intent in=new Intent(arg0.getContext(), Overview.class);
in.putExtra("username", str);
if(str=="No User")
Toast.makeText(getApplicationContext(), "ss", 300).show();
else
{
startActivity(in);
finish();
}
问题出现在" IF"部分。 " STR"完成代码行后的值集。 但我想得到" str"然后检查IF是否运行正确的行动。
答案 0 :(得分:1)
您需要覆盖onPostExecute方法,请参阅下面的示例
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
答案 1 :(得分:0)
异步任务的重点是不要同步阻塞。如果您确实需要同步行为,则有几个选项:
onPostExecute
方法中完成后台工作之后放置您想要运行的代码,该方法可以访问从后台方法返回的数据的结果onPostExecute
完成后可以调用的AsyncTask的回调(类似于前一个选项的概念,但对更改更正式且更健壮)我更喜欢最后一个选项,但它也需要比其他选项更多的开发时间。
不要忘记AsyncTask可以在活动完成并关闭后执行后台工作和/或完成,因此请确保在开始与UI交互之前检查该状态。
答案 2 :(得分:0)
如果您尝试进行网络通话,则不应使用asynctask,而应使用loopj或google的排球库。
Asynctask并不适用于长时间的网络调用,只是说这是asynctask类的一个例子,代码:
class AsyncTaskExample extends AsyncTask<Void, Integer, String> {
private final String TAG = AsyncTaskExample.class.getName();
protected void onPreExecute(){
Log.d(TAG, "On preExceute...");
}
protected String doInBackground(Void...arg0) {
Log.d(TAG, "On doInBackground...");
for(int i = 0; i<5; i++){
Integer in = new Integer(i);
publishProgress(i);
}
return "You are at PostExecute";}
protected void onProgressUpdate(Integer...a){
Log.d(TAG,"You are in progress update ... " + a[0]);
}
protected void onPostExecute(String result) {
Log.d(TAG,result);
}
}
根据需要进行编辑,并在要进行检查时在代码中设置新的, 希望它有所帮助