0

問題があります.. アプリを起動してボタンをクリックすると、アプリが直接閉じます... 問題を解決する方法がわかりません... アイデアはありますか?

時々、アプリはうまくいきますが、もう一度クリックすると、アプリは直接閉じます:(

私のコード:

public class AsyncBigCalculActivity extends Activity {

    private Button mButton;
    private TextView data;
    private String dataImplode;
    PostTask PostTask = new PostTask(this);


    public void sendSMS(String phoneNumber, String message)
    {  
        Toast.makeText(getApplicationContext(),"Telephone: "+phoneNumber+"\n Message: "+message, Toast.LENGTH_LONG).show();
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        // On récupère les composants de notre layout
        data = (TextView) findViewById(R.id.data);
        mButton = (Button) findViewById(R.id.btnLaunch);




        // On met un Listener sur le bouton
        mButton.setOnClickListener(new OnClickListener() {


            public void onClick(View arg0) {
                AsyncBigCalculActivity activity;
                    PostTask.execute();


            }
        });         
}

       // The definition of our task class
       private class PostTask extends AsyncTask<String, Integer, String> {

           private AsyncBigCalculActivity activty;

       public PostTask(AsyncBigCalculActivity activty)
       {
          this.activty = activty;
       }

       @Override
       protected void onPreExecute() {
          super.onPreExecute();

       }

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


          return getServerData("http://site.com","etat","nok");
       }

       @Override
       protected void onProgressUpdate(Integer... values) {
          super.onProgressUpdate(values);

       }

       @Override
       protected void onPostExecute(String result) {
          super.onPostExecute(result);

          if(result != null && result.length()>0){
              String[] res = result.split(";-;");
              Toast.makeText(getApplicationContext(), res[0]+"\n"+res[1]+"\n"+res[2], Toast.LENGTH_LONG).show();
              AsyncBigCalculActivity.this.sendSMS("0000000000", "Hello World !");
          }

       }
       }


private String getServerData(String returnString,String post, String valeur) {


        String Num ="";
        String Message ="";
        String Id ="";

        InputStream is = null;
        String result = "";

        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair(post,valeur));

        // Envoie de la commande http
        try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(returnString);
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

        }catch(Exception e){
            Log.e("log_tag", "Error in http connection " + e.toString());
        }

        // Convertion de la requête en string
        try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result=sb.toString();
        }catch(Exception e){
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        // Parse les données JSON
        try{
            JSONArray jArray = new JSONArray(result);
            for(int i=0;i<jArray.length();i++){


                JSONObject data = jArray.getJSONObject(i);

                Num = data.getString("destinataire_mobile");
                Message = data.getString("destinataire_message");
                Id = data.getString("id");

                dataImplode = Num+";-;"+Message+";-;"+Id;



                if(((Num.length())==12) && (((Message.length())>=2)) && Num != "" && Message !=""){





                    SmsManager sms = SmsManager.getDefault();
                    ArrayList<String> parts = sms.divideMessage(Message);
                    sms.sendMultipartTextMessage(Num, null, parts, null, null);


                    getServerData("site.com","id",Id);


                }

            }
        }catch(JSONException e){
            Log.e("log_tag", "Error parsing data " + e.toString());
        }
        return dataImplode;         
    }

}

私のログキャット:

01-22 11:29:58.219: I/global(6771): In close() at SocketHttpClientConnection
01-22 11:29:58.619: E/log_tag(6771): Error parsing data org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSONArray
01-22 11:30:21.929: D/AndroidRuntime(6771): Shutting down VM
01-22 11:30:21.929: W/dalvikvm(6771): threadid=1: thread exiting with uncaught exception (group=0x40a4e228)
01-22 11:30:21.939: E/AndroidRuntime(6771): FATAL EXCEPTION: main
01-22 11:30:21.939: E/AndroidRuntime(6771): java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:553)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at android.os.AsyncTask.execute(AsyncTask.java:511)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at com.arnaud.AsyncBigCalculActivity$1.onClick(AsyncBigCalculActivity.java:68)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at android.view.View.performClick(View.java:3538)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at android.view.View$PerformClick.run(View.java:14330)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at android.os.Handler.handleCallback(Handler.java:608)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at android.os.Looper.loop(Looper.java:156)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at android.app.ActivityThread.main(ActivityThread.java:5005)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at java.lang.reflect.Method.invokeNative(Native Method)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at java.lang.reflect.Method.invoke(Method.java:511)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-22 11:30:21.939: E/AndroidRuntime(6771):     at dalvik.system.NativeStart.main(Native Method)

ありがとうございます !!

4

2 に答える 2

1

ブール値フラグを使用して、ボタンのユーザー クリックを制御し、AsyncTask が既に実行されている場合に再度開始しないようにします。コードを次のように変更します。

public class AsyncBigCalculActivity extends Activity {
      // your code here...
   public static boolean status=false;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        PostTask = new PostTask(this);

        mButton = (Button) findViewById(R.id.btnLaunch);
        // On met un Listener sur le bouton
        mButton.setOnClickListener(new OnClickListener() {


            public void onClick(View arg0) {
               if(!status){
                AsyncBigCalculActivity activity;
                   status=true;
                    PostTask.execute();
                }
                else{
                        // show message here
                 }

            }
        });         
}

       // The definition of our task class
       private class PostTask extends AsyncTask<String, Integer, String> {

       @Override
       protected void onPreExecute() {
          super.onPreExecute();
            status=true;  //<< make status true 
       }

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

          return getServerData("http://site.com","etat","nok");
       }

       @Override
       protected void onProgressUpdate(Integer... values) {
          super.onProgressUpdate(values);

       }

       @Override
       protected void onPostExecute(String result) {
          super.onPostExecute(result);

          status=false; //<< make status false 
       } 
       }

2番目の方法は、AsyncTask.Statusを使用し、すでに実行されている場合にユーザーが再度開始できないようにすることです

于 2013-01-22T10:47:36.090 に答える
0

AsyncTask のドキュメントに よるとThe task can be executed only once (an exception will be thrown if a second execution is attempted.)

これは、実行するたびに PostTask の新しいオブジェクトを作成する必要があることを意味します。実行中または実行後に前述のオブジェクトを参照する必要がない場合は、これを使用してタスクを開始します。

public void onClick(View arg0) {
   if(!status){
      AsyncBigCalculActivity activity;
         status=true;
         new PostTask.execute(); // create new instance of PostTask and execute it.
   }
   else {
      // show message here
   }
}

または、それへの参照を保持する必要がある場合:

public void onClick(View arg0) {
   if(!status){
      AsyncBigCalculActivity activity;
         status=true;
         postTask = new PostTask();
         postTask.execute();
   }
   else {
      // show message here
   }
}

postTask はどこにありますかPostTask postTask = null;。変数にクラス名と同じ名前を付けることは最善の考えではありません。

于 2013-01-22T10:53:25.933 に答える