簡體   English   中英

Android應用:頁面停止工作

[英]Android App: page stopped working

我正在開發一個簡單的Android應用程序,並得到一個'應用程序停止工作'錯誤。

當我退出我的preOnExecute方法時,似乎發生了錯誤,但是如果我發表評論,那么應用程序無論如何都會落在下一個代碼片上。

測試:打開屏幕/活動,有5個預先填充的文本框和一個按鈕。 如果我單擊該按鈕,代碼將命中一個在“OnPreExecute”中打開對話框的類,並且在執行此方法時失敗。

它可能與后台線程有關,不喜歡在UI上發生什么,但我不知道。

知道如何解決這個問題嗎?

請參閱下面的代碼

package android22.app.namespace;

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

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android22.voter.namespace.appSubmitAnswerActivity.GetQuestionDetails;
import android22.voter.namespace.appSubmitAnswerActivity.SaveAnswerDetails;

public class appCreateQuestionActivity extends Activity  {

    //controls

       EditText editTextTitle;
       EditText editTextQuestionString;
       EditText editTextA1;
       EditText editTextA2;
       EditText editTextA3;
       EditText editTextA4;
       EditText editTextA5;
       Button buttonSubmitQuestion;



       // Progress Dialog 
       private ProgressDialog qDialog; 

       // JSON parser class 
       JSONParser jsonParser = new JSONParser(); 

       // single question url 
       private static final String url_insert_question_details = "http://xxx.xxx.xxx.xxx/voter/Voter_Db_CreateNewQuestion.php"; 


       // JSON Node names
       private static final String TAG_SUCCESS = "success";
       private static final String TAG_QUESTION = "question";
       private static final String TAG_QID = "Qid";
       private static final String TAG_TITLE = "Title";
       private static final String TAG_QUESTIONSTRING = "QuestionString";
       private static final String TAG_A1 = "A1";
       private static final String TAG_A2 = "A2";
       private static final String TAG_A3 = "A3";
       private static final String TAG_A4 = "A4";
       private static final String TAG_A5 = "A5";


    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.createquestion);

        // save button 
        buttonSubmitQuestion = (Button) findViewById(R.id.btnCreate); 
        /*Set Control Listeners */

        buttonSubmitQuestion.setOnClickListener(new View.OnClickListener() { 

           @Override
            public void onClick(View view) {           

                // starting background task to update question 
              new SaveQuestionDetails().execute();
            } 
        }); 



    }

    class SaveQuestionDetails extends AsyncTask<String, String, String> {

           /**
            * Before starting background thread Show Progress Dialog
            * */
           @Override
           protected void onPreExecute() {
               super.onPreExecute();
               qDialog = new ProgressDialog(VoterCreateQuestionActivity.this);
               qDialog.setMessage("Saving ...");
               qDialog.setIndeterminate(false);
               qDialog.setCancelable(true);
               qDialog.show();  
           }

           /**
            * Saving question
            * */
           protected String doInBackground(String... args) {

               String Title = editTextTitle.getText().toString();
               String Question = editTextQuestionString.getText().toString();
               String A1 = editTextA1.getText().toString();
               String A2 = editTextA2.getText().toString();
               String A3 = editTextA3.getText().toString();
               String A4 = editTextA4.getText().toString();
               String A5 = editTextA5.getText().toString();


               // Building Parameters
               List<NameValuePair> params = new ArrayList<NameValuePair>();
               params.add(new BasicNameValuePair(TAG_QID, "1"));
               params.add(new BasicNameValuePair(TAG_TITLE, Title));
               params.add(new BasicNameValuePair(TAG_QUESTION, Question));
               params.add(new BasicNameValuePair(TAG_A1, A1));
               params.add(new BasicNameValuePair(TAG_A2, A2));
               params.add(new BasicNameValuePair(TAG_A3, A3));
               params.add(new BasicNameValuePair(TAG_A4, A4));
               params.add(new BasicNameValuePair(TAG_A5, A5));


               // sending modified data through http request
               // Notice that update question url accepts POST method
               JSONObject json = jsonParser.makeHttpRequest(url_insert_question_details,
                       "POST", params);

               // check json success tag
               try {
                   int success = json.getInt(TAG_SUCCESS);

                   if (success == 1) {
                       // successfully updated
                       Intent i = getIntent();
                       // send result code 100 to notify about question update
                       setResult(100, i);
                       finish();
                   } else {
                       // failed to update question
                   }
               } catch (JSONException e) {
                   e.printStackTrace();
               }

               return null;
           }

           /**
            * After completing background task Dismiss the progress dialog
            * **/
           protected void onPostExecute(String file_url) {
               // dismiss the dialog once question updated
               qDialog.dismiss();
           }
       }
}

我得到以下LogCat

09-20 16:03:15.703: D/gralloc_goldfish(658): Emulator without GPU emulation detected.
09-20 16:20:39.298: W/dalvikvm(658): threadid=12: thread exiting with uncaught exception (group=0x409961f8)
09-20 16:20:39.463: E/AndroidRuntime(658): FATAL EXCEPTION: AsyncTask #1
09-20 16:20:39.463: E/AndroidRuntime(658): java.lang.RuntimeException: An error occured while executing doInBackground()
09-20 16:20:39.463: E/AndroidRuntime(658):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
09-20 16:20:39.463: E/AndroidRuntime(658):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-20 16:20:39.463: E/AndroidRuntime(658):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-20 16:20:39.463: E/AndroidRuntime(658):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-20 16:20:39.463: E/AndroidRuntime(658):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-20 16:20:39.463: E/AndroidRuntime(658):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-20 16:20:39.463: E/AndroidRuntime(658):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-20 16:20:39.463: E/AndroidRuntime(658):  at java.lang.Thread.run(Thread.java:856)
09-20 16:20:39.463: E/AndroidRuntime(658): Caused by: java.lang.NullPointerException
09-20 16:20:39.463: E/AndroidRuntime(658):  at android22.voter.namespace.AppCreateQuestionActivity$SaveQuestionDetails.doInBackground(VoterCreateQuestionActivity.java:109)
09-20 16:20:39.463: E/AndroidRuntime(658):  at android22.voter.namespace.AppCreateQuestionActivity$SaveQuestionDetails.doInBackground(VoterCreateQuestionActivity.java:1)
09-20 16:20:39.463: E/AndroidRuntime(658):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
09-20 16:20:39.463: E/AndroidRuntime(658):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-20 16:20:39.463: E/AndroidRuntime(658):  ... 4 more
09-20 16:20:41.493: E/WindowManager(658): Activity android22.voter.namespace.AppCreateQuestionActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@416e3798 that was originally added here
09-20 16:20:41.493: E/WindowManager(658): android.view.WindowLeaked: Activity android22.voter.namespace.AppCreateQuestionActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@416e3798 that was originally added here
09-20 16:20:41.493: E/WindowManager(658):   at android.view.ViewRootImpl.<init>(ViewRootImpl.java:343)
09-20 16:20:41.493: E/WindowManager(658):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:245)
09-20 16:20:41.493: E/WindowManager(658):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193)
09-20 16:20:41.493: E/WindowManager(658):   at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118)
09-20 16:20:41.493: E/WindowManager(658):   at android.view.Window$LocalWindowManager.addView(Window.java:537)
09-20 16:20:41.493: E/WindowManager(658):   at android.app.Dialog.show(Dialog.java:274)
09-20 16:20:41.493: E/WindowManager(658):   at android22.voter.namespace.AppCreateQuestionActivity$SaveQuestionDetails.onPreExecute(VoterCreateQuestionActivity.java:101)
09-20 16:20:41.493: E/WindowManager(658):   at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
09-20 16:20:41.493: E/WindowManager(658):   at android.os.AsyncTask.execute(AsyncTask.java:511)
09-20 16:20:41.493: E/WindowManager(658):   at android22.voter.namespace.VoterCreateQuestionActivity$1.onClick(AppCreateQuestionActivity.java:81)
09-20 16:20:41.493: E/WindowManager(658):   at android.view.View.performClick(View.java:3480)
09-20 16:20:41.493: E/WindowManager(658):   at android.view.View$PerformClick.run(View.java:13983)
09-20 16:20:41.493: E/WindowManager(658):   at android.os.Handler.handleCallback(Handler.java:605)
09-20 16:20:41.493: E/WindowManager(658):   at android.os.Handler.dispatchMessage(Handler.java:92)
09-20 16:20:41.493: E/WindowManager(658):   at android.os.Looper.loop(Looper.java:137)
09-20 16:20:41.493: E/WindowManager(658):   at android.app.ActivityThread.main(ActivityThread.java:4340)
09-20 16:20:41.493: E/WindowManager(658):   at java.lang.reflect.Method.invokeNative(Native Method)
09-20 16:20:41.493: E/WindowManager(658):   at java.lang.reflect.Method.invoke(Method.java:511)
09-20 16:20:41.493: E/WindowManager(658):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-20 16:20:41.493: E/WindowManager(658):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-20 16:20:41.493: E/WindowManager(658):   at dalvik.system.NativeStart.main(Native Method)

錯誤是由第109行引起的:

String Title = editTextTitle.getText().toString();

這是一個NullPointerException。 最有可能的原因是,類成員變量editTextTitle未在任何地方初始化。 您通常通過使用相關控件ID調用findViewById() ,在setContentView()之后的某個時間初始化onCreate()那些。

也就是說,類似“這里有大量代碼,請為我調試”的問題在StackOverflow上不受歡迎。 您可以通過在AsyncTask方法中放置斷點並逐步執行每個斷點來輕松捕獲錯誤。 那,或者仔細閱讀LogCat中的異常跟蹤。

編輯:LogCat中的以下行是相關的:

09-20 16:20:39.463: E/AndroidRuntime(658): Caused by: java.lang.NullPointerException
09-20 16:20:39.463: E/AndroidRuntime(658):  at android22.voter.namespace.AppCreateQuestionActivity$SaveQuestionDetails.doInBackground(VoterCreateQuestionActivity.java:109)

行號就在那里。 異常被捕獲並重新拋出幾次 - 這是典型的。 但要找到最終原因,您需要在堆棧跟蹤中查找代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM