【问题标题】:Design a Quiz activity which refreshes every 20 seconds (Reworked)设计一个每 20 秒刷新一次的测验活动(重做)
【发布时间】:2015-06-23 07:01:54
【问题描述】:

我正在制作一个测验应用程序,其中我有一个测验活动,我正在做以下工作。

  1. 从服务器获取数据(现在使用 Asynctask 获取所有数据)。
  2. 为我的 UI 设置数据(进展顺利)。
  3. 获取用户输入并检查标记的答案。
  4. 每 20 秒刷新一次活动,包含新问题(我正在使用处理程序)

我拥有所有数据,现在希望我的 UI 刷新我拥有的数据中的新问题。我该怎么做?
任何帮助表示赞赏。

以下是我正在使用的代码。

public class Quiz extends ActionBarActivity {
private SessionManager session;
Intent intent;
String categoryid,userid,uri="http://demopurpose.com/Quiz/API/";
JSONArray jArray;
InputStream is;
JSONObject json_data;
String[] data;
int len,countdown=20,lastquestion=0;
private Handler mHandler,handler;
protected static final long TIME_DELAY = 20000;
TextView txtcountdown,txtquestion,txtanswer;
Button btn1,btn2,btn3,btn4;
String opt1,opt2,opt3,opt4,question,answer ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quiz);
    this.session = new SessionManager(this);
    mHandler = new Handler();
    handler = new Handler();

    AdView mAdView = (AdView) findViewById(R.id.adView);
    AdRequest adRequest = new AdRequest.Builder().build();
    mAdView.loadAd(adRequest);

    txtcountdown =(TextView)findViewById(R.id.txtcountdown);
    txtquestion = (TextView)findViewById(R.id.txtquestion);

    btn1 =(Button)findViewById(R.id.btn1);
    btn2 =(Button)findViewById(R.id.btn2);
    btn3 =(Button)findViewById(R.id.btn3);
    btn4 =(Button)findViewById(R.id.btn4);

    userid= session.getuserid();
    intent =getIntent();
    categoryid = intent.getExtras().getString("categoryid");


    data = new String[3]; 
    data[0] = userid;
    data[1] = categoryid;
    data[2] = Integer.toString(lastquestion);

    btn1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            opt1 = btn1.getText().toString();
            opt2 = btn2.getText().toString();
            opt3 = btn3.getText().toString();
            opt4 = btn4.getText().toString();

            if (opt1.equals(answer)) {
                btn2.setEnabled(false);
                btn3.setEnabled(false);
                btn4.setEnabled(false);
                btn1.setBackgroundResource(R.color.colortrue);
            }
            else{
                btn1.setBackgroundResource(R.color.colorfalse);
                btn2.setEnabled(false);
                btn3.setEnabled(false);
                btn4.setEnabled(false);
            }
        }
    });

    btn2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            opt1 = btn1.getText().toString();
            opt2 = btn2.getText().toString();
            opt3 = btn3.getText().toString();
            opt4 = btn4.getText().toString();

            if (opt2.equals(answer)) {
                btn1.setEnabled(false);
                btn3.setEnabled(false);
                btn4.setEnabled(false);
                btn2.setBackgroundResource(R.color.colortrue);
            }
            else{
                btn2.setBackgroundResource(R.color.colorfalse);
                btn1.setEnabled(false);
                btn3.setEnabled(false);
                btn4.setEnabled(false);
            }
        }
    });

    btn3.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            opt1 = btn1.getText().toString();
            opt2 = btn2.getText().toString();
            opt3 = btn3.getText().toString();
            opt4 = btn4.getText().toString();

            if (opt3.equals(answer)) {
                btn2.setEnabled(false);
                btn1.setEnabled(false);
                btn4.setEnabled(false);
                btn3.setBackgroundResource(R.color.colortrue);
            }
            else{
                btn3.setBackgroundResource(R.color.colorfalse);
                btn2.setEnabled(false);
                btn1.setEnabled(false);
                btn4.setEnabled(false);
            }
        }
    });

    btn4.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            opt1 = btn1.getText().toString();
            opt2 = btn2.getText().toString();
            opt3 = btn3.getText().toString();
            opt4 = btn4.getText().toString();

            if (opt4.equals(answer)) {
                btn2.setEnabled(false);
                btn3.setEnabled(false);
                btn1.setEnabled(false);
                btn4.setBackgroundResource(R.color.colortrue);
            }
            else{
                btn4.setBackgroundResource(R.color.colorfalse);
                btn2.setEnabled(false);
                btn3.setEnabled(false);
                btn1.setEnabled(false);
            }
        }
    });
    new GetData().execute(data);
}


Runnable refreshActivity=new Runnable(){  
    public void run() {  
          countdown =20;
          lastquestion++;
          mHandler.postDelayed(this, TIME_DELAY);  
         }  
     };  

Runnable refreshCounter = new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        countdown--;
        txtcountdown.setText("Time Remaining"+countdown);
        handler.postDelayed(this, 1000);
    }
}; 

public JSONArray getquiz(String uid, String cid,String lastindex) {

    String result = "";
    try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(uri+"question.php");
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
            nameValuePairs.add(new BasicNameValuePair("userId", uid));
            nameValuePairs.add(new BasicNameValuePair("categoryId", cid));
            nameValuePairs.add(new BasicNameValuePair("lastquestionId", lastindex));

            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());
    }
    //convert response to 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();
            Log.e("result...",result);
            jArray = new JSONArray(result);
            Log.e("Array...", ""+jArray);

    }catch(Exception e){
            Log.e("log_tag", "Error converting result "+e.toString());
    }
    return jArray;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.quiz, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        Log.e("click...", "");
        return true;
    }
    return super.onOptionsItemSelected(item);
}

private class GetData extends AsyncTask<String, Void, Object[]>
{
    @Override
    protected Object[] doInBackground(String... params) {
        String cid,uid,lastindex;
        uid = params[0];
        cid = params[1];
        lastindex = params[2];
        Log.e("Data"," "+cid+" "+uid+" "+lastindex);
        JSONArray arr = new JSONArray();
        arr = getquiz(uid, cid, lastindex);

        Object[] obj = new Object[2];
        obj[0]=arr;
        obj[1]=lastindex;

        return obj;
    }      

    @Override
    protected void onPostExecute(Object[] obj) {
        JSONArray arr = new JSONArray();
        String lastindex;
        arr = (JSONArray)obj[0];
        lastindex =(String)obj[1];
        int li;
        if(arr!=null) {
            try{
                    li= Integer.parseInt(lastindex);
                    json_data = arr.getJSONObject(li);

                String flag="";
                flag =json_data.getString("success");

                if(flag.equalsIgnoreCase("0"))
                {   
                    runOnUiThread(new Runnable() {
                        public void run() {
                            Toast.makeText(Quiz.this, "Unable to load Quiz...Try again", Toast.LENGTH_SHORT).show();
                        }
                    });

                }
                else
                {   
                    runOnUiThread(new Runnable() {
                        public void run() {
                            Toast.makeText(Quiz.this, "Loading Quiz...", Toast.LENGTH_SHORT).show();
                            try{
                                txtquestion.setText(json_data.getString("title"));
                                btn1.setText(json_data.getString("option1"));
                                btn1.setBackgroundResource(R.color.colorreset);
                                btn1.setEnabled(true);

                                btn2.setText(json_data.getString("option2"));
                                btn2.setBackgroundResource(R.color.colorreset);
                                btn2.setEnabled(true);

                                btn3.setText(json_data.getString("option3"));
                                btn3.setBackgroundResource(R.color.colorreset);
                                btn3.setEnabled(true);

                                btn4.setText(json_data.getString("option4"));
                                btn4.setBackgroundResource(R.color.colorreset);
                                btn4.setEnabled(true);

                                answer = json_data.getString("answer");

                                mHandler.post(refreshActivity);
                                handler.post(refreshCounter);

                            }
                            catch(JSONException je){
                                je.printStackTrace();
                            }
                        }
                    });
                }
            }
            catch(JSONException je){
                je.printStackTrace();
            }
        }
    }
}
}

【问题讨论】:

  • 每 20 秒刷新一次活动以从服务器拉取请求,这是最糟糕的过程,增加时间或我们一个接一个地递归调用。
  • 我该如何做这样的事情,我可以在活动开始时调用数据,当数据被消耗时,我会调用服务器以获取更多数据
  • 你应该忘记那 20 秒。仅在用户回答问题后刷新。或按“继续”。
  • 或者用户是否只有 20 秒的时间来解决一个问题?不清楚你想要什么。
  • @greenapps 准确无误,用户只能在 20 秒内回答

标签: android android-handler


【解决方案1】:

有两种方法:

1) 使用 AsyncTask:对于一个一个进程,您应该使用 asynctask。

2) 使用线程:在 asynctask 中调用您的 api,并且每次在 asynctask 中以 20 秒的递归时间在线程中调用,刷新所有,即:布局、ID、视图和所有。

【讨论】:

    【解决方案2】:

    这里是sn-p使用ScheduledExecutorService调度任务的代码,希望能给个方法。此类将每 20 秒更新一次文本视图。最初(启动时)它将等待 20 秒,之后它将开始修改文本视图。基本上,如果服务器足够快,可以在 20 秒内给出响应。您可以在 run() 中下载数据并通过 Message 将其传递给处理程序。但我更喜欢下载问题/数据(以使应用程序更具响应性并减少请求数量),然后使用 ScheduledExecutorService 填充它。

    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.TextView;
    public class MainActivity extends Activity {
    private TextView textView;
    private int i=0;
    private ScheduledExecutorService executor;
    private Handler handler=new Handler()
    {
        public void handleMessage(Message msg) {
            textView.setText(msg.arg1+"");
        };
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=(TextView)findViewById(R.id.textView1);
        executor=Executors.newSingleThreadScheduledExecutor();
        executor.scheduleAtFixedRate(new Runnable() {
    
            @Override
            public void run() {
            Message message=Message.obtain();
            message.arg1=i;
            i++;
            handler.sendMessage(message);
            }
        },20, 20, TimeUnit.SECONDS);
    
        }
    
    @Override
    protected void onPause() {
        super.onPause();
        executor.shutdown();
    
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 2022-07-06
      • 2016-03-21
      • 2012-06-13
      • 2014-06-01
      相关资源
      最近更新 更多