【问题标题】:Change method using db helper into AsyncTask将使用 db helper 的方法更改为 AsyncTask
【发布时间】:2015-05-23 18:34:12
【问题描述】:

我的主线程中有一个方法,它从我的 db 助手类中获取值并返回一个字符串,并将另一个字符串分配给 texview。

但我想在后台执行操作并将结果发布到我的主 UI 线程上。通读文档,我正在努力了解如何创建 AsyncTask,或者至少构建它以在不影响功能的情况下实现这一目标。我目前的主线程方法:

     public String showNextRandomQuestion3() {

            SQLDatabaseHelper db = new SQLDatabaseHelper(this);

            //get the data from the database
            List<List<String>> listList = db.getAllAnswersByQuestion1();

            //Get the question/text/answer Strings
            List<String> questionStrings = listList.get(0); //question Strings
            List<String> answerSetIds = listList.get(1);

            //Generate random index
            Random r = new Random();
            int rand = Math.abs((r.nextInt() % questionStrings.size()));

            //get answer description for randomly selected question
            String questionString = questionStrings.get(rand);  
            String answerSetId = answerSetIds.get(rand);

            String regex = "\\[|\\]";
            questionString = questionString.replaceAll(regex, "");
            answerSetId = answerSetId.replaceAll(regex, "");

            questionView.setText(questionString);

            return answerSetId;
            }

任何有关为此创建 AsyncTask 方法的帮助将不胜感激。


在进行建议的更改时 - 我得到以下异常:

05-23 21:23:44.510: D/AndroidRuntime(4598): Shutting down VM
05-23 21:23:44.510: W/dalvikvm(4598): threadid=1: thread exiting with uncaught exception (group=0x415aad88)
05-23 21:23:44.520: E/AndroidRuntime(4598): FATAL EXCEPTION: main
05-23 21:23:44.520: E/AndroidRuntime(4598): Process: com.example.quizapp, PID: 4598
05-23 21:23:44.520: E/AndroidRuntime(4598): java.util.NoSuchElementException
05-23 21:23:44.520: E/AndroidRuntime(4598):     at java.util.StringTokenizer.nextToken(StringTokenizer.java:208)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at com.example.quizapp.MainActivity.showNextAnswers(MainActivity.java:431)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at com.example.quizapp.MainActivity$7.onClick(MainActivity.java:339)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at android.view.View.performClick(View.java:4569)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at android.view.View$PerformClick.run(View.java:18553)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at android.os.Handler.handleCallback(Handler.java:743)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at android.os.Looper.loop(Looper.java:136)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at android.app.ActivityThread.main(ActivityThread.java:5212)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at java.lang.reflect.Method.invokeNative(Native Method)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at java.lang.reflect.Method.invoke(Method.java:515)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
05-23 21:23:44.520: E/AndroidRuntime(4598):     at dalvik.system.NativeStart.main(Native Method)
05-23 21:23:46.460: I/Process(4598): Sending signal. PID: 4598 SIG: 9
05-23 21:23:46.770: D/dalvikvm(5085): GC_FOR_ALLOC freed 50K, 74% free 3071K/11416K, paused 10ms, total 10ms
05-23 21:23:46.790: I/dalvikvm-heap(5085): Grow heap (frag case) to 19.905MB for 15422416-byte allocation
05-23 21:23:46.980: I/Adreno-EGL(5085): <qeglDrvAPI_eglInitialize:410>: EGL 1.4 

单击一个按钮后,我需要将此方法与其他几个方法一起调用,这就是我没有将 onClick 放在 AsyncTask 中的原因:

        NextQuestionButton.setOnClickListener(new OnClickListener(){;
                @Override
        public void onClick(View v) {  

//                  showNextAnswers();                      showNextQuestion();
                    showNextRandomQuestion3();
                    countQuestions();

                }});

【问题讨论】:

  • 为什么要在AsyncTask中进行DB操作?它在主线程上做了很多工作吗?
  • 是的。我因为在主线程上做太多事情而遇到异常。

标签: java android multithreading android-asynctask


【解决方案1】:

可能低于代码将适合您。

//Define This in Activity Class;
private String answerId;

private class Task extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
            SQLDatabaseHelper db = new SQLDatabaseHelper(MainActivity.this);

            //get the data from the database
            List<List<String>> listList = db.getAllAnswersByQuestion1();

            //Get the question/text/answer Strings
            List<String> questionStrings = listList.get(0); //question Strings
            List<String> answerSetIds = listList.get(1);

            //Generate random index
            Random r = new Random();
            int rand = Math.abs((r.nextInt() % questionStrings.size()));

            //get answer description for randomly selected question
            String questionString = questionStrings.get(rand);  
            String answerSetId = answerSetIds.get(rand);

            String regex = "\\[|\\]";
            answerId = answerSetId.replaceAll(regex, "");
            return mQuestionString = questionString.replaceAll(regex, "");

    }

    @Override
    protected void onPostExecute(String result) {
         questionView.setText(questionString);  
    }

}

【讨论】:

  • 谢谢 - 很大的帮助。目前我仍然遇到异常 - W/dalvikvm(4598): threadid=1: thread exiting with uncaught exception (group=0x415aad88)。对此有什么想法吗?
  • @jrgart 你能告诉我堆栈跟踪吗?或者可以指出您在哪条线上遇到异常?
  • 已将其添加到我上面的问题中
  • 检查 MainActivity.java:339 行是否有异常。可能是您在迭代集合时使用了错误的逻辑。
  • 干杯 - 这是我调用的另一种方法,我尚未更改为使用“answerId”字符串。我现在还有一个问题 - 我也在上面发布了 - 我将如何从 onClick 调用 AsyncTask
猜你喜欢
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 2021-04-24
  • 1970-01-01
相关资源
最近更新 更多