2012-12-20 19 views
-2

我已经创建了一个应用程序,点击一个按钮说[下一步]。我打电话的方法这种方法的工作是生成5个随机数,并把它们放在5个按钮随机,每个按钮,它会随机选择小(2秒)的音频文件并进行播放的点击。如果我点击按钮[下一步]超过8次,我的整个应用程序重新启动。Appilcation停止响应,主线程做这么多工作..?

如果呼叫nextChangeAdd();方法一次又一次我的应用程序停止更多的10次函数调用后作出回应。请给我一些替代? logcat的也没有显示

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Typeface; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 


public class Addition extends Activity{ 

    TextView addNo1, addNo2; 
    Button option1, option2, option3, option4, next; 
    Random randomGenerator; 
    Integer randomInt1, randomInt2; 
    int flag = 0, setans; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.additionactivity); 
     addNo1 = (TextView) findViewById(R.id.addNOOne); 
     addNo2 = (TextView) findViewById(R.id.addNOTwo); 
     option1 = (Button) findViewById(R.id.addoption1); 
     option2 = (Button) findViewById(R.id.addoption2); 
     option3 = (Button) findViewById(R.id.addoption3); 
     option4 = (Button) findViewById(R.id.addoption4); 
     next = (Button) findViewById(R.id.addNextBtn); 
     next.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       nextChangeAdd(); 
      } 
     }); 
     randomGenerator = new Random(); 
     Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/StefanieDots.ttf"); 
     addNo1.setTypeface(tf); 
     nextChangeAdd(); 

    } 

    public void nextChangeAdd() { 
     randomInt1 = randomGenerator.nextInt(10); 
     randomInt2 = randomGenerator.nextInt(10); 
     setans = randomGenerator.nextInt(5); 
     if (setans == 0) { 
      setans++; 
     } 
     int ans = randomInt1 + randomInt2; 
     String addans = Integer.toString(ans); 
     addNo1.setText(randomInt1.toString()); 
     addNo2.setText(randomInt2.toString()); 
     List<Integer> generated = new ArrayList<Integer>(); 
     for (int i = 0; i < 3; i++) { 
      while (true) { 
       Integer next = randomGenerator.nextInt(19) + 1; 
       if (!generated.contains(ans)) { 
        generated.add(next); 
        break; 
       } 
      } 
     } 

     switch (setans) { 
     case 1: 
      flag = 1; 
      option1.setText(addans); 
      option1.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //rightAns(); 
       } 
      }); 

      break; 
     case 2: 
      flag = 2; 
      option2.setText(addans); 
      option2.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //rightAns(); 
       } 
      }); 

      break; 
     case 3: 
      flag = 3; 
      option3.setText(addans); 
      option3.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //rightAns(); 
       } 
      }); 
      break; 
     case 4: 
      flag = 4; 
      option4.setText(addans); 
      option4.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //rightAns(); 
       } 
      }); 
         break; 
     } 
     String a2 = generated.get(0).toString(); 
     String a3 = generated.get(1).toString(); 
     String a4 = generated.get(2).toString(); 

     if (flag == 1) { 
      option2.setText(a2); 
      option2.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
      option3.setText(a3); 
      option3.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
      option4.setText(a4); 
      option4.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
     } 
     if (flag == 2) { 
      option1.setText(a2); 
      option2.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
      option3.setText(a3); 
      option3.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
      option4.setText(a4); 
      option4.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
     } 
     if (flag == 3) { 
      option2.setText(a2); 
      option2.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
      option1.setText(a3); 
      option1.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
      option4.setText(a4); 
      option4.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
     } 

     if (flag == 4) { 
      option2.setText(a2); 
      option2.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
      option3.setText(a3); 
      option3.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
      option1.setText(a4); 
      option1.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //wrongAns(); 
       } 
      }); 
     } 
    } 



} 

回答

0

Use AsyncTask

异步任务是通过三种通用类型称为PARAMS,进展和结果定义的任何错误。

参数:参数用于将参数发送到异步任务。

进度:进度用于在任务正在进行时将数据从异步任务发送到UI线程(主线程)。

结果:结果用于在执行后将数据从异步任务发送到UI线程。

异步任务是在四个步骤完成如下:

onPreExecute:在启动该任务上UI线程执行的回调方法。

doInBackground:非UI线程执行的回调方法中,如果存在onPreExecute方法后调用。

onProgressUpdate:在UI线程上执行的回调方法,由doInBackground()方法的publishProgress()调用。

onPostExecute:在完成任务后调用的UI线程上执行的回调方法。

+0

都在主线程的代码是紧耦合如何shuold我使用异步任务? –

1

没有什么在需要很长的时间来执行代码,使的AsyncTask是不能解决问题的。

事实上,这是一个逻辑上的错误,让一个无限循环如下:

while (true) { 
    Integer next = randomGenerator.nextInt(19) + 1; 
    if (!generated.contains(ans)) { 
     generated.add(next); 
     break; 
    } 
} 

如果真的发生,那ans生成并插入到列表,循环将永远不会结束。

相关问题