2016-07-14 65 views
0

无论我做什么,我都无法阻止我的AsyncTask; cancel(),把所有的工作放在while循环中,然后再打破。无法停止执行的AsyncTask

我的任务是从一个Mysql服务器获取/发送数据。我知道这是最糟糕的方式,但这是我在java中执行了一些步骤后的第一次尝试。

所以我想执行并完成所有工作,并在显示布局之前停止在onCreate()(在setContentView()之前)。因为,如果我点击一个按钮,使用数据库中的数据来填充微调器可能还没有被下载。

我不想检查我的arraylist,我用来填补微调,如果它是“空”导致工作不正常。

所以,如果我能做到这一点,我可以显示一些关于连接失败的警告给用户。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

connect2 cnc=new connect2(); 
    cnc.execute(); 



    if (cnc.getStatus()==AsyncTask.Status.FINISHED) 
    { 
     setContentView(R.layout.window2); 
    } 


} 

    private class connect2 extends AsyncTask<Void , Void, Void> { 


    @Override 
    protected Void doInBackground(Void... params) { 

     try { 

      Class.forName("com.mysql.jdbc.Driver"); 
      Connection conn = DriverManager.getConnection(a, b, c); 
      PreparedStatement prs = conn.prepareStatement("select * from film , kategori,yonetmen where film.kategori_id=kategori.id and film.yonetmen_id=yonetmen.id"); 
      ResultSet rs = prs.executeQuery(); 
      PreparedStatement prs2 = conn.prepareStatement("select * from kategori "); 
      ResultSet rs2 = prs2.executeQuery(); 
      PreparedStatement prs3 = conn.prepareStatement("select * from yonetmen "); 
      ResultSet rs3 = prs3.executeQuery(); 

      while (rs.next()) { 
       Kategori k = new Kategori(rs.getInt("kategori.id"), rs.getString("kategori.ad")); 
       Yonetmen y = new Yonetmen(rs.getInt("yonetmen.id"), rs.getString("yonetmen.ad")); 
       Film f = new Film(rs.getInt("id"), rs.getString("ad"), rs.getInt("sene"), k, y); 
       ab.add(f); 

      } 
      rs.close(); 
      size = ab.size(); 
      while (rs2.next()) { 
       Kategori k = new Kategori(rs2.getInt("kategori.id"), rs2.getString("kategori.ad")); 
       ac.add(k); 

      } 
      rs2.close(); 
      while (rs3.next()) { 
       Yonetmen k = new Yonetmen(rs3.getInt("yonetmen.id"), rs3.getString("yonetmen.ad")); 
       ad.add(k); 

      } 
      rs3.close(); 

      switch (sw) { 

       case 1: 

        StringBuilder cmd = new StringBuilder(); 
        cmd.append("insert into film (ad,sene,yonetmen_id,kategori_id) values ('"); 
        cmd.append(fa + "',"); 
        cmd.append(ya + ","); 
        cmd.append(idy + ","); 
        cmd.append(idk + ")"); 
        sw = 0; 


        try { 
         PreparedStatement sql = conn.prepareStatement(cmd.toString()); 
         rslt = sql.executeUpdate(); 

         conn.close(); 
        } catch (SQLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        break; 

       case 2: 


        try { 
         PreparedStatement sql = conn.prepareStatement("delete from film where id=" + idy); 
         rslt2 = sql.executeUpdate(); 
         sw = 0; 

         conn.close(); 
        } catch (SQLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 

        break; 
       default: 
        break; 

      } 
      conn.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 


    } @Override 
    protected void onPostExecute(Void aVoid) { 

     list=ab; 
     listk=ac; 
     listy=ad; 


     if (rslt==1) { 


      AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this); 
      builder1.setMessage("Film Başarıyla Kaydedildi"); 
      builder1.setCancelable(true); 

      builder1.setPositiveButton(
        "Tamam", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 



      AlertDialog alert11 = builder1.create(); 
      alert11.show(); 
      rslt=0; 

     } 

     if (rslt2==1) { 


      AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this); 
      builder1.setMessage("Silindi"); 
      builder1.setCancelable(true); 

      builder1.setPositiveButton(
        "Tamam", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 



      AlertDialog alert11 = builder1.create(); 
      alert11.show(); 
      rslt2=0; 

     } 

     super.onPostExecute(aVoid); 
    } 

回答

0

这样执行。试图打破你的代码零件,检查是否被取消或不

doInBackground(){ 
    if(!isCancelled()){ 
    // few line of codes 
    }else{ 
    return null; 
    } 
    if(!isCancelled()){ 
    // another few line of codes 
    }else{ 
    return null; 
    } 
    if(!isCancelled()){ 
    // another few line of codes 
    }else{ 
    return null; 
    } 
} 
+0

谢谢, 但我在哪里呼叫cancel()? –

+0

@ Gogo-the-Cat:你必须调用它才能返回true,如果它被取消 –

+0

通过你不能返回一个值的方式,如果它在一个块内。 –

0

AsyncTask.cancel()不会不顾后果杀死线程。它所做的就是将AsyncTask设置为“取消”状态。 AsyncTask的开发者坚持取消doInBackground()的状态。