Android:异步任务执行doInBackground()时发生错误

时间:2015-08-07 07:21:22

标签: java android json android-asynctask

使用异步任务之前我的代码是可行的。所以我在我的代码中做了一些更改,现在进度条显示出来但是出现了以下错误。

Log cat:

08-07 06:43:15.875: E/AndroidRuntime(1734): FATAL EXCEPTION: AsyncTask #1
08-07 06:43:15.875: E/AndroidRuntime(1734): java.lang.RuntimeException: An error occured while executing doInBackground()
08-07 06:43:15.875: E/AndroidRuntime(1734):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
08-07 06:43:15.875: E/AndroidRuntime(1734):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
08-07 06:43:15.875: E/AndroidRuntime(1734):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-07 06:43:15.875: E/AndroidRuntime(1734):     ... 18 more

mycode的:

        protected String doInBackground(String... args) {
            final EditText eKey = (EditText) findViewById(R.id.edtxt_key);
            inputs = eKey.getText().toString();
            if (inputs.matches("")) {

            } else {
                keys = url + inputs;
                JSONParser jParser = new JSONParser();
                JSONObject json = jParser.getJSONFromUrl(keys);
                try {
                    satu = json.getJSONObject(TAG_1);
                    String two = satu.getString(TAG_2);
                    String three = satu.getString(TAG_3);
                    if (two.matches("") | three.matches("")) {
                        AlertDialog.Builder builder = new AertDialog.Builder(MainActivity.this);
                        builder.setMessage("not found!").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                 eKey.setText("");
                                 status.setText("Key not found!");
                            }
                        });
                        AlertDialog alert = builder.create();
                        alert.show();
                    } else {
                        Intent x = new Intent(MainActivity.this, result.class);
                        x.putExtra("bac", two);
                        x.putExtra("cab", three);
                        startActivity(x);
                        eKey.setText("");
                        keys = "";
                        inputs = "";
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }

出了什么问题?提前谢谢。

3 个答案:

答案 0 :(得分:7)

alert.show();

eKey.setText("");

无法在后台任务中执行。传递来自

的返回值
  

doInBackground()

  

onPostExecute()

方法并在那里执行UI任务。

答案 1 :(得分:2)

您不应在doInBackground()

中保留任何与UI相关的元素

例如, 如果您从网络下载任何员工,那时您想要更新UI,您可以使用onProgressUpdate()更新UI并实施publishProgress() @doInBackground().

否则, AsynTask在单独的工作线程中运行,使用doInBackground()方法在UI后面执行人员(当Asyntask在后台运行时,我们可以显示加载对话框)。完成工作后,我们可以使用onPostExecute()更新用户界面。

如果您需要更多关于AsynTask的说明,请务必拍摄您的问题......

快乐编码:)

答案 2 :(得分:1)

AsynTask类提供了三种主要方法:

  • onPreExecute()
  • doInBackground()
  • onPostExecute()

两个方法 onPreExecute() onPostExecute()在包含UI的类的同一个线程中执行。

方法 doInBackground()在不同的线程上执行。由于我们无法从在不同线程上运行的进程引用UI,因此我们可以:

  • 将我们的代码(指的是UI)移动到 onPostExecuted ()方法
  • 使用handlers(如果需要,也可以从不同的线程引用UI)

再见:)