AsyncTasks에 대한 좋은 양을 읽었지만 뭔가를 파악할 수 없습니다. 내 데이터베이스에서 요청에 대한 HttpURLConnection에 사용되는 시작 AsyncTask 있어요. 데이터베이스 작업은 doInBackground()에서 수행되며로드 중임을 나타내는 UI 스레드에서 실행되는 ProgressDialog가 있습니다. 그래도 doInBackground()가 완료되면 코드가 계속되기 전에 일어날 필요가있는 onPostExecute()에 몇 가지 사항이 있어도 코드가 계속됩니다.AsyncTask가 onPostExecute()를 완료하면서 ProgressDialog에 대한 UI 스레드를 열어 둘 때까지 기다립니다.
AsyncTask를 비동기로 유지하여 ProgressDialog를 실행할 수 있고 동시에 doInBackgroun()에서 데이터베이스 작업을 수행 할 수 있습니까? 또한 onPostExecute()가 호출 될 때까지 계속 대기 할 수 있습니까?
는 명확히하기 :난 그냥 onPostExecute() 호출에서 함수를 호출 할 수 없습니다. 실행시 사용자가 로그인 할 수 있도록 사용자 이름과 비밀번호를 입력 할 수 있도록 AlertDialog가 열립니다. 그들이 login을 누르면 AsyncTask가 실행됩니다. onPostExecute()가 언제 완료되었는지 알기 위해 AlertDialog가 필요합니다. 그렇지 않으면 나는 그것에 매달릴 것이다.
public void Login(String username, String password)
{
try
{
new AsyncLogin().execute(username, password).get();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
catch (ExecutionException e1)
{
e1.printStackTrace();
}
}
private class AsyncLogin extends AsyncTask<String, String, String>
{
private static final int READ_TIMEOUT = 1000000;
private static final int CONNECTION_TIMEOUT = 1000000;
private URL url = null;
private HttpURLConnection conn = null;
ProgressDialog loading = new ProgressDialog(currActivity);
@Override
protected void onPreExecute()
{
super.onPreExecute();
loading.setMessage("\tLoading...");
loading.setCancelable(false);
loading.show();
}
@Override
protected String doInBackground(String... params)
{
try
{
url = new URL("http://mysite/myscript.php");
}
catch (MalformedURLException e)
{
e.printStackTrace();
return "Malformed URL Exception.";
}
try
{
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(READ_TIMEOUT);
conn.setConnectTimeout(CONNECTION_TIMEOUT);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
Uri.Builder builder = new Uri.Builder()
.appendQueryParameter("username", params[0])
.appendQueryParameter("password", params[1]);
String query = builder.build().getEncodedQuery();
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(query);
writer.flush();
writer.close();
conn.connect();
}
catch (IOException e1)
{
e1.printStackTrace();
return "Connection Exception.";
}
try
{
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK)
{
InputStream input = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null)
{
result.append(line);
}
return result.toString();
}
else return "Unsuccessful data retrieval.";
}
catch (IOException e2)
{
e2.printStackTrace();
return "Response Exception.";
}
finally
{
conn.disconnect();
}
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
loading.dismiss();
if (result.equalsIgnoreCase("true"))
{
// Successfully logged in
SetIsLoggedIn(true);
Toast.makeText(currActivity, "Successfully logged in.", Toast.LENGTH_LONG).show();
}
else
{
// Incorrect credentials
SetIsLoggedIn(false);
Toast.makeText(currActivity, "Incorrect credentials.", Toast.LENGTH_LONG).show();
}
}
}
설명이 약간 불분명합니다. 실행하지 마십시오. 어떤 코드가'onPostExecute()'에서해야 할 일을 할 때까지 기다려야한다. –
'onPostExecute()'에서'ProgressDialog'을 닫고 로그인이 성공하면'AlertDialog'을 닫는다. 문제가있는 곳을 실제로 볼 수는 없습니다. –
@MikeM. AlertDialog를 배치하는 방법으로 내가 어떻게 AlertDialog를 무시할 수 있는지 보지 못하고있는 것 같습니다. – saboehnke