1

如果我的结果字符串为空,我想取消 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();

                                                                     }
}

我应该怎么走?我应该使用哪些方法?

4

3 回答 3

0

AsyncTask 主要用于我们想要在后台线程中执行的操作,例如 web 服务调用。在这种情况下,您使用 AsyncTask 通过 web 服务保存用户名和密码。因此,在执行 AsyncTask 之前,您必须对用户名和密码的编辑文本进行验证并进行空值检查。如果一切正常并根据定义的密码策略获取密码,只需使用 httppost 的这两个值调用 AsyncTask。

于 2013-10-09T10:36:39.747 回答
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); } 
        }
    });
于 2013-10-09T09:07:33.367 回答
0

我注意到这个旧帖子没有答案。所以我会发布这个,希望它可以帮助其他人。

要取消任务,只需调用cancel()

尝试取消此任务的执行。如果任务已完成、已被取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且在调用取消时此任务尚未启动,则此任务不应该运行。如果任务已经开始,则 mayInterruptIfRunning 参数确定是否应该中断执行该任务的线程以尝试停止该任务。

参数 mayInterruptIfRunning 如果执行此任务的线程应该被中断,则为 true;否则,允许完成正在进行的任务。

如果任务无法取消,则返回false,通常是因为它已经正常完成;否则为真


所以在你的情况下:

result = sb.toString();

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

在任务之外取消:

myTask.cancel(true);

您可以使用isCancel()检查,如果此任务在正常完成之前被取消,则返回true。

此外,您可以覆盖 asynctask 方法onCancelled()以在它被取消时采取行动。

@Override
protected void onCancelled() {

}
于 2014-10-21T17:16:57.733 回答