2013-10-09 3 views
1

Я хочу отменить asyncTask, если моя строка результата равна нулю. (Я получаю имя пользователя и пароль от пользователя в действии входа в систему, и если это имя пользователя и пароль не существуют в базе данных, asyncTask должен отменить и начать выполнение одной и той же задачи.) Я прочитал и применил что-то, но они не сделали Не бегай. Вот мой AsyncTask:Как остановить AsyncTask, если результат выборки данных равен нулю?

class ProductConnect extends AsyncTask<Boolean, String, String> { 

    public AsyncResponse delegate=null; 

    private Activity activity; 


    public void MyAsyncTask(Activity activity) { 
     this.activity = activity; 
    } 


    @Override 
    protected String doInBackground(Boolean... params) { 

     String result = null; 

     StringBuilder sb = new StringBuilder(); 

     try { 

      // http post 
      HttpClient httpclient = new DefaultHttpClient(); 

      HttpGet httppost = new HttpGet("http://191.165.2.235/getProducts.php?login=1&user_name="+UserName+"&user_pass="+Password); 



      HttpResponse response = httpclient.execute(httppost); 

      if (response.getStatusLine().getStatusCode() != 200) { 
       Log.d("MyApp", "Server encountered an error"); 
      } 

      BufferedReader reader = new BufferedReader(
        new InputStreamReader(
          response.getEntity().getContent(), "UTF8")); 



      sb = new StringBuilder(); 

      sb.append(reader.readLine() + "\n"); 

      if(reader.readLine() == null){ 

       asyncTask.cancel(true); 
      } 

      String line = null; 

      while ((line = reader.readLine()) != null) { 

       sb.append(line + "\n"); 

       if (isCancelled()) break; 
      } 


      result = sb.toString(); 

      Log.d("test", result); 

     } 
     catch (Exception e) { 

      Log.e("log_tag", "Error converting result " + e.toString()); 

     } 

     return result; 
    } 




    @Override 
    protected void onPostExecute(String result) { 

     Intent passValue=new Intent(MainActivity.this, second.class); 



     try { 

      JSONArray jArray = new JSONArray(result); 
      JSONObject json_data; 
      for (int i = 0; i < jArray.length(); i++) { 
       json_data = jArray.getJSONObject(i); 

       t = json_data.getString("name"); 
       names.add(t);            

       latitude=json_data.getString("lat"); 
       lats.add(latitude);          

       longtitude=json_data.getString("lon"); 
       longts.add(longtitude);         

      } 


      passValue.putStringArrayListExtra("latitudes", (ArrayList<String>) lats); 

      passValue.putStringArrayListExtra("veri", (ArrayList<String>) names); 

      passValue.putStringArrayListExtra("longtitudes", (ArrayList<String>) longts); 

      startActivity(passValue); 

     } catch (JSONException e1) { 
      e1.printStackTrace(); 
     } catch (ParseException e1) { 
      e1.printStackTrace(); 
     } 
     super.onPostExecute(result); 
    } 

    protected void onPreExecute()       { 
      super.onPreExecute(); 
      ProgressDialog pd = new ProgressDialog(MainActivity.this); 
      pd.setTitle("Lütfen Bekleyiniz"); 
      pd.setMessage("Authenticating.."); 
      pd.show(); 

                    } 
} 

Как я должен следовать по пути? Какие методы я должен использовать?

+0

http://stackoverflow.com/questions/16538714/stop-asynctask-doinbackground-method/16538887. проверьте это – Raghunandan

+0

Я пробовал решение вроде этого, но оно не запускается или я что-то пропускаю. – elfoz

ответ

0

Здесь отсутствует логика, вы должны вызывать только задачу Async, если ваши данные не равны нулю. Как это

b.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      EditText username=(EditText)findViewById(R.id.editText2); 

      String UserName=username.getText().toString().trim(); 

      EditText password=(EditText)findViewById(R.id.editText1); 
      String Password=password.getText().toString().trim(); 

      if (UserName.length()>0&& Password.length()>0) { 
       asyncTask.execute(true); } 
     } 
    }); 
+1

Это не сработало, и я также хочу проверить, является ли строка данных выборки нулевыми, поэтому мне нужно сделать это в фоновом режиме или onpostexecute? – elfoz

+0

Соединение с базой данных запускается при нажатии кнопки onCreate. и я попробовал: b.setOnClickListener (новый OnClickListener() { \t \t \t \t \t \t @Override \t \t \t общественного недействительными OnClick (View arg0) { \t \t \t \t // TODO Auto-генерироваться метод заглушки \t \t \t \t \t \t \t \t имя пользователя = (EditText) findViewById (R.id.editText2); \t. \t \t \t \t \t \t \t UserName = username.getText() ToString(); \t \t \t \t \t \t пароль = (EditText) findViewById (R.id.editText1); . \t \t \t \t \t \t \t \t \t Пароль = password.getText() ToString(); \t \t \t \t \t \t \t \t если (UserName = NULL && Password = нуль!) { \t \t \t \t \t asyncTask.execute (истина); \t \t} – elfoz

+0

Обновлен ответ, сейчас –

0

AsyncTask в основном используя для операций, которые мы хотим сделать в фоновом потоке, как WebService вызов. В этом случае вы используете AsyncTask для сохранения имени пользователя и пароля через webservice. Поэтому перед выполнением AsyncTask вы должны проверить и иметь нуль-проверку для обоих текстов редактирования для имени пользователя и пароля. Если все в порядке и получите пароль в соответствии с определенной политикой пароля, просто вызовите AsyncTask с этими двумя значениями для httppost.

+0

Я сказал свою проблему неправильно, поэтому я обновил свое объяснение вопроса. Я беру имя пользователя и пароль от пользователя, затем я проверил их в базе данных. Если это имя пользователя и пароль не существуют в базе данных, AsyncTask должен остановиться, не запускать вторую активность, и новая AsyncTask должна быть готова к запуску на странице входа. Я в замешательстве, что я могу сделать это в своем почтовом коде? – elfoz

+0

Так что лучше написать две AsyncTask. Один для проверки доступности имени пользователя (пароль может быть таким же), а второй для нажатия значения в db. Запустите вторую AsyncTask из onPostExecute() первой. –

+0

Могу ли я решить эту проблему с помощью одной AsyncTask. Это невозможно? – elfoz

0

Я замечаю, что у этого старого сообщения нет ответа. Поэтому я опубликую это, надеюсь, это поможет другим.

Чтобы отменить задание просто вызовите cancel()

Попытки отменить выполнение этой задачи. Эта попытка потерпит неудачу, если задача уже завершена, уже отменена или не может быть отменена по другой причине. В случае успеха, и эта задача имеет , не запущенный при вызове отмены, эта задача никогда не должна запускаться. Если задача уже запущена, параметр mayInterruptIfRunning определяет, должен ли поток, выполняющий эту задачу, прервать попытку остановить задачу.

Параметры mayInterruptIfRunning верно, если поток выполнения этой задачи должно быть прервано; в противном случае выполнение выполненных задач может быть завершено.

Возвращает ложь, если задача не может быть отменено, как правило, потому что она уже завершена нормально; правда, в противном случае


Так что в вашем случае:

result = sb.toString(); 

if(result==null){ 
    this.cancel(true); 
} 
Log.d("test", result); 

отменить вне задачи:

myTask.cancel(true); 

Вы можете использовать isCancel(), чтобы проверить, она возвращает истину, если эта задача была отменено до его завершения в обычном режиме.

Кроме того, вы можете переопределить метод asynctask onCancelled(), чтобы принять меры, когда он отменен.

@Override 
protected void onCancelled() { 

} 
Смежные вопросы