2013-10-09 74 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

這裏你缺少邏輯,如果你的數據不爲空,你應該只調用異步任務。 像這樣

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 @覆蓋 \t \t \t公共無效的onClick(查看爲arg0){ \t \t \t \t // TODO自動生成方法存根 \t \t \t \t \t \t \t \t用戶名=(的EditText)findViewById(R.id.editText2); \t。\t \t \t \t \t \t \t \t用戶名= 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如果(用戶名= NULL &&密碼!= NULL!){ \t \t \t \t \t asyncTask.execute(真); \t \t} – elfoz

+0

已更新的答案,現在檢查 –

0

的AsyncTask主要是利用我們希望在後臺線程來做,像Web服務調用操作。在這種情況下,您使用AsyncTask通過webservice保存用戶名和密碼。因此,在執行AsyncTask之前,您必須驗證並對用戶名和密碼的編輯文本進行空值檢查。如果一切正常,並根據定義的密碼策略獲取密碼,只需使用這兩個值調用具有httppost的AsyncTask。

+0

我以錯誤的方式告訴我的問題,所以我更新了我的問題解釋。我從用戶那裏獲取用戶名和密碼,然後在數據庫中檢查他們。如果數據庫中不存在該用戶名和密碼,則應停止AsyncTask,不要啓動第二個活動,並且新的AsyncTask必須準備好在登錄頁面中啓動。我很困惑,我可以在發佈代碼中做什麼? – elfoz

+0

所以最好寫兩個AsyncTask。一個用於檢查用戶名的可用性(密碼可以相同),第二個用於將值壓入db。從第一個onPostExecute()開始第二個AsyncTask。 –

+0

我可以用一個AsyncTask解決這個問題嗎?完全不可能嗎? – elfoz

0

我注意到這個老帖子沒有答案。所以我會發布這個,希望它會幫助別人。

取消任務只需調用cancel()

試圖取消對此任務的執行。如果 任務已完成,已被取消或因其他原因不能取消 ,此嘗試將失敗。如果成功,並且此任務有 在調用取消時未啓動,則此任務不應運行。如果 任務已經啓動,則mayInterruptIfRunning參數 將確定執行此任務的線程是否應在嘗試停止任務時中斷 。

參數 mayInterruptIfRunning真,如果執行此任務的線程應該被中斷;否則,正在進行的任務被允許完成。

返回 假,如果任務不能被取消,通常是由於它已經正常完成;真正否則


你的情況

所以:

result = sb.toString(); 

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

取消任務之外:

myTask.cancel(true); 

您可以使用isCancel()檢查,它,如果這個任務是返回true在正常完成之前取消。

此外,您可以重寫asynctask方法onCancelled()以在取消時執行操作。

@Override 
protected void onCancelled() { 

} 
相關問題