Android异步问题

时间:2013-12-30 16:56:12

标签: android asynchronous

我的应用程序崩溃,但我不明白日志。也许在Android开发中有更多实验的人可以帮助我。我认为这是异步的问题,但我不知道如何解决这个问题。

日志

12-30 17:40:57.045: E/AndroidRuntime(26286): FATAL EXCEPTION: AsyncTask #2
12-30 17:40:57.045: E/AndroidRuntime(26286): java.lang.RuntimeException: An error occured while executing doInBackground()
12-30 17:40:57.045: E/AndroidRuntime(26286):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at java.lang.Thread.run(Thread.java:856)
12-30 17:40:57.045: E/AndroidRuntime(26286): Caused by: java.lang.NullPointerException
12-30 17:40:57.045: E/AndroidRuntime(26286):    at com.begital.votrebijoutier.ShopActivity$GetJson.doInBackground(ShopActivity.java:339)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at com.begital.votrebijoutier.ShopActivity$GetJson.doInBackground(ShopActivity.java:1)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-30 17:40:57.045: E/AndroidRuntime(26286):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-30 17:40:57.045: E/AndroidRuntime(26286):    ... 5 more
12-30 17:40:57.165: D/dalvikvm(26286): GC_CONCURRENT freed 1742K, 22% free 15029K/19143K, paused 2ms+17ms, total 77ms
12-30 17:40:57.715: E/WindowManager(26286): Activity com.begital.votrebijoutier.ShopActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41baa298 that was originally added here
12-30 17:40:57.715: E/WindowManager(26286): android.view.WindowLeaked: Activity com.begital.votrebijoutier.ShopActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41baa298 that was originally added here
12-30 17:40:57.715: E/WindowManager(26286):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:374)
12-30 17:40:57.715: E/WindowManager(26286):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
12-30 17:40:57.715: E/WindowManager(26286):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
12-30 17:40:57.715: E/WindowManager(26286):     at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
12-30 17:40:57.715: E/WindowManager(26286):     at android.view.Window$LocalWindowManager.addView(Window.java:547)
12-30 17:40:57.715: E/WindowManager(26286):     at android.app.Dialog.show(Dialog.java:277)
12-30 17:40:57.715: E/WindowManager(26286):     at com.begital.votrebijoutier.ShopActivity$GetJson.onPreExecute(ShopActivity.java:187)
12-30 17:40:57.715: E/WindowManager(26286):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
12-30 17:40:57.715: E/WindowManager(26286):     at android.os.AsyncTask.execute(AsyncTask.java:534)
12-30 17:40:57.715: E/WindowManager(26286):     at com.begital.votrebijoutier.ShopActivity.onCreate(ShopActivity.java:169)
12-30 17:40:57.715: E/WindowManager(26286):     at android.app.Activity.performCreate(Activity.java:5008)
12-30 17:40:57.715: E/WindowManager(26286):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
12-30 17:40:57.715: E/WindowManager(26286):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
12-30 17:40:57.715: E/WindowManager(26286):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
12-30 17:40:57.715: E/WindowManager(26286):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
12-30 17:40:57.715: E/WindowManager(26286):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
12-30 17:40:57.715: E/WindowManager(26286):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-30 17:40:57.715: E/WindowManager(26286):     at android.os.Looper.loop(Looper.java:137)
12-30 17:40:57.715: E/WindowManager(26286):     at android.app.ActivityThread.main(ActivityThread.java:4745)
12-30 17:40:57.715: E/WindowManager(26286):     at java.lang.reflect.Method.invokeNative(Native Method)
12-30 17:40:57.715: E/WindowManager(26286):     at java.lang.reflect.Method.invoke(Method.java:511)
12-30 17:40:57.715: E/WindowManager(26286):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-30 17:40:57.715: E/WindowManager(26286):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-30 17:40:57.715: E/WindowManager(26286):     at dalvik.system.NativeStart.main(Native Method)

这是班级:

public class ShopActivity extends Activity {

private int userIcon, jewelleryIcon;
private GoogleMap theMap;
private LocationManager locMan;
private Marker userMarker;
private Marker bijouterie;
private Button emailButton;
private long latitude;
private long longitude;
private String image1;
private String image2;
private ImageButton button1;
private ImageButton button2;
private ImageButton button3;
private ImageButton button4;
private ImageButton button5;
private ImageButton catalogue;
private Button goToMap;
private String thebooketurl = null;
private String url;
private ProgressDialog pDialog;

/** Called when the activity is first created. 
 * @return */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shop);

    // Get url
    Bundle extras = getIntent().getExtras(); if (extras == null) {
        return;
        }
        String urlshop = extras.getString("shopurl");

    String credentials = "?clientid";
    url = (urlshop+credentials);
    System.out.println("url --->" + url);


            // Internet check
            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            android.net.NetworkInfo wifi = cm
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            android.net.NetworkInfo datac = cm
                    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if ((wifi != null & datac != null)
                    && (wifi.isConnected() | datac.isConnected())) {
                    //connection is OK
                     }else{
                    //no connection
                      Toast toast = Toast.makeText(ShopActivity.this, "Une erreur a été rencontrée. Veuillez vérifier votre connexion à internet",
                    Toast.LENGTH_LONG);

            toast.show();  
                     }

         // Check status of Google Play Services
            int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

            // Check Google Play Service Available
            try {
                if (status != ConnectionResult.SUCCESS) {
                }
            } catch (Exception e) {
                Log.e("Error: GooglePlayServiceUtil: ", "" + e);
            }

    // Google Maps

            userIcon = R.drawable.blue_point;
            jewelleryIcon = R.drawable.pointeur;

            if(theMap==null){
                //map not instantiated yet
            }
            theMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.the_map)).getMap();
            if(theMap != null){
                //ok - proceed
            }
            theMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

    // Map
            LatLng BIJOUTERIE = new LatLng(latitude, longitude); 
            bijouterie = theMap.addMarker(new MarkerOptions()
            .position(BIJOUTERIE)
            .title("Bijouterie")
            .icon(BitmapDescriptorFactory.fromResource(jewelleryIcon))
            .snippet("rue du Temple, Marseille"));

            theMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 7.5f), 4000, null);             



            // Calling async task to get json
            new GetJson().execute();

 }

/**
 * Async task class to get json by making HTTP call
 * */
private class GetJson extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();


        // Showing progress dialog
        pDialog = new ProgressDialog(ShopActivity.this);
        pDialog.setMessage("Chargement...");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

        Log.d("Response: ", "> " + jsonStr);



    // View's main buttons

            goToMap = (Button)findViewById(R.id.mapClick);
            goToMap.setOnClickListener(new OnClickListener()  
            {
               @Override          
               public void onClick(View goToMap) {
                   Intent intent = new Intent(ShopActivity.this, FullMapActivity.class);
                   startActivity(intent);
                   overridePendingTransition(R.anim.fadein, R.anim.fadeout);
               }
               });

            button1 = (ImageButton)findViewById(R.id.imageButton1);
            button1.setOnClickListener(new OnClickListener()  
            {
               @Override          
               public void onClick(View Button1) {
                  finish();//go back to the previous Activity
                overridePendingTransition(R.anim.backin, R.anim.backout); 
               }
               });

            button2 = (ImageButton)findViewById(R.id.imageButton2);
            button2.setOnClickListener(new OnClickListener()  
            {
               @Override          
               public void onClick(View Button1) {
                   Intent i = new Intent(Intent.ACTION_SEND);
                    i.setType("message/rfc822");
                    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"contact@mail.fr"});
                    i.putExtra(Intent.EXTRA_SUBJECT, "");
                    i.putExtra(Intent.EXTRA_TEXT   , "");
                    try {
                        startActivity(Intent.createChooser(i, "Send mail..."));
                    } catch (android.content.ActivityNotFoundException ex) {
                        Toast.makeText(ShopActivity.this, "Pas de client de messagerie installé sur cet appareil.", Toast.LENGTH_SHORT).show();
                    }
                }
                });

            button3 = (ImageButton)findViewById(R.id.imageButton3);
            button3.setOnClickListener(new OnClickListener()  
            {
               @Override          
               public void onClick(View Button1) {
                   Intent intent = new Intent(ShopActivity.this, PhilosophyActivity.class);
                   startActivity(intent);
                   overridePendingTransition(R.anim.animationin, R.anim.animationout);
               }
               });

            button4 = (ImageButton)findViewById(R.id.imageButton4);
            button4.setOnClickListener(new OnClickListener()  
            {
               @Override          
               public void onClick(View Button1) {
                   finish();//go back to the previous Activity
                   overridePendingTransition(R.anim.backin, R.anim.backout); 
               }
               });

            button5 = (ImageButton)findViewById(R.id.imageButton6);
            button5.setOnClickListener(new OnClickListener()  
            {
               @Override          
               public void onClick(View Button1) {
                   Intent intent = new Intent(ShopActivity.this, MapActivity.class);
                   startActivity(intent);
                   overridePendingTransition(R.anim.animationin, R.anim.animationout);
               }
               });

            catalogue = (ImageButton)findViewById(R.id.feuilletez);
            catalogue.setOnClickListener(new OnClickListener()  
            {
               @Override          
               public void onClick(View Button1) {
                   Intent bookleturl = new Intent(ShopActivity.this, PdfReader.class);
                    bookleturl.putExtra("bookleturl", thebooketurl);
                    startActivity(bookleturl);

                   Intent intent = new Intent(ShopActivity.this, PdfReader.class);
                   startActivity(intent);
                   overridePendingTransition(R.anim.animationin, R.anim.animationout);
               }
               });

    // Add fonts

       //     Typeface typeFace=Typeface.createFromAsset(getAssets(),"fonts/HelveticaNeueBold.ttf");

    // View's items
             TextView shopAddressTextView=(TextView) findViewById(R.id.shopAddress);
            // shopAddressTextView.setTypeface(typeFace);
             TextView shopNameTextView=(TextView) findViewById(R.id.shopName);
             TextView shopPhoneTextView=(TextView) findViewById(R.id.shopPhone);
             TextView shopFaxTextView=(TextView) findViewById(R.id.shopFax);
             TextView shopHoursTextView=(TextView) findViewById(R.id.shopHours);
             TextView shopHoursTextView2=(TextView) findViewById(R.id.shopHours2);
             ImageView firstImage=(ImageView) findViewById(R.id.firstImage);
             ImageView secondImage=(ImageView) findViewById(R.id.secondImage);

             /*
            // Reading text file from assets folder
            StringBuffer sb = new StringBuffer();
            BufferedReader br = null;
            try {
                br = new BufferedReader(new InputStreamReader(getAssets().open(
                        "test.json")));
                String temp;
                while ((temp = br.readLine()) != null)
                    sb.append(temp);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    br.close(); // stop reading
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            String myjsonstring = sb.toString();
            Log.d("string: " , myjsonstring);*/



            JSONArray array = null;
            try {
                array = new JSONArray(jsonStr);
            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {
                JSONObject jsonObject = array.getJSONObject(0);
                 String id = jsonObject.getString("id");
                 System.out.println("id --->" + id);
                 String url = jsonObject.getString("url");
                 System.out.println("url --->" + url);
                 String created_at = jsonObject.getString("created_at");
                 System.out.println("created_at --->" + created_at);
                 String updated_at = jsonObject.getString("updated_at");
                 System.out.println("updated_at --->" + updated_at);
                 String name = jsonObject.getString("name");
                 shopNameTextView.setText(jsonObject.getString("name"));
                 System.out.println("name --->" + name);
                 String phone = jsonObject.getString("phone");
                 if(phone == "null")
                     shopPhoneTextView.setText("-");
                 else
                 shopPhoneTextView.setText(jsonObject.getString("phone"));
                 System.out.println("phone --->" + phone);
                 String fax = jsonObject.getString("fax");
                 if(fax == "null")
                     shopFaxTextView.setText("-");
                 else
                     shopFaxTextView.setText(jsonObject.getString("fax"));
                 System.out.println("fax --->" + fax);

                 final String email = jsonObject.getString("email");

                 emailButton = (Button)findViewById(R.id.buttonEmail);  
                 emailButton.setOnClickListener(new OnClickListener()
                    {
                    @Override          
                    public void onClick(View Button4) {
                        Intent i = new Intent(Intent.ACTION_SEND);
                        i.setType("message/rfc822");
                        if(email == "null")
                            i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"contact@mail.fr"});
                         else
                        i.putExtra(Intent.EXTRA_EMAIL  , new String[]{email});
                        i.putExtra(Intent.EXTRA_SUBJECT, "");
                        i.putExtra(Intent.EXTRA_TEXT   , "");
                        try {
                            startActivity(Intent.createChooser(i, "Send mail..."));
                        } catch (android.content.ActivityNotFoundException ex) {
                            Toast.makeText(ShopActivity.this, "Pas de client de messagerie installé sur cet appareil.", Toast.LENGTH_SHORT).show();
                        }
                    }
                    });


//shopEmailTextView.setText(jsonObject.getString("email"));
                 System.out.println("email --->" + phone);
                 String website_url = jsonObject.getString("website_url");
                 System.out.println("website_url --->" + phone);
                 String detail = jsonObject.getString("detail");
                 System.out.println("detail --->" + detail);
                 String logo_url = jsonObject.getString("logo_url");
                 System.out.println("logo_url --->" + logo_url);
                 String logo_thumbnail_url = jsonObject.getString("logo_thumbnail_url");
                 System.out.println("logo_thumbnail_url --->" + logo_thumbnail_url);
                 JSONArray photos_urls = jsonObject.getJSONArray("photos_urls");
                 System.out.println("photos_urls --->" + photos_urls);

                 image1 = photos_urls.getString(0);

                 if(image1 != null){
                 new DownloadImageTask((ImageView) findViewById(R.id.firstImage))
                    .execute(image1);
                 }

                 image2 = photos_urls.getString(0);

                 if(image2 != null){
                 new DownloadImageTask((ImageView) findViewById(R.id.secondImage))
                  .execute(image2);
                 }


                 JSONArray opening_hours = jsonObject.getJSONArray("opening_hours");

                 String hoursTitle = "Horaires d'ouverture :";
                 String lundi = opening_hours.getString(0);
                 if(lundi==null)
                     lundi = "NC";
                 String mardi = opening_hours.getString(1);
                 String mercredi = opening_hours.getString(2);
                 String jeudi = opening_hours.getString(3);
                 String vendredi = opening_hours.getString(4);
                 String samedi = opening_hours.getString(5);

                 shopHoursTextView.setText(hoursTitle+"\nLundi : "+lundi+"\nMardi : "+mardi+"\nMercredi : "+mercredi+"");
                 shopHoursTextView2.setText("Jeudi : "+jeudi+"\nVendredi : "+vendredi+"\nSamedi : "+samedi);




                 System.out.println("opening_hours --->" + opening_hours);
                 String address_string = jsonObject.getString("address_string");
                 shopAddressTextView.setText(jsonObject.getString("address_string"));
                 System.out.println("address_string --->" + address_string);

                 JSONObject contact = jsonObject.getJSONObject("contact");
                 String title = contact.getString("title");
                 System.out.println("title --->" + title);
                 String first_name = contact.getString("first_name");
                 System.out.println("first_name --->" + first_name);
                 String last_name = contact.getString("last_name");
                 System.out.println("last_name --->" + last_name);

                 JSONObject address = jsonObject.getJSONObject("address");
                 String id_address = address.getString("id");
                 System.out.println("id --->" + id_address);
                 String url_address = address.getString("url");
                 System.out.println("url --->" + url_address);
                 String created_at_address = address.getString("created_at");
                 System.out.println("created_at_address --->" + created_at_address);
                 String updated_at_address = address.getString("updated_at");
                 System.out.println("updated_at_address --->" + updated_at_address);
                 String street_address = address.getString("street_address");
                 System.out.println("street_address --->" + street_address);
                 String extended_address = address.getString("extended_address");
                 System.out.println("extended_address --->" + extended_address);
                 String postal_code = address.getString("postal_code");
                 System.out.println("postal_code --->" + postal_code);
                 String locality = address.getString("locality");
                 System.out.println("locality --->" + locality);
                 String country_code_alpha2 = address.getString("country_code_alpha2");
                 System.out.println("country_code_alpha2 --->" + country_code_alpha2);
                 JSONArray coordinates = address.getJSONArray("coordinates");
                 System.out.println("coordinates --->" + coordinates);

                 latitude = coordinates.getLong(0);
                 longitude = coordinates.getLong(1);



                 JSONObject booklet = jsonObject.getJSONObject("booklet");
                 String id_booklet = booklet.getString("id");
                 System.out.println("id_booklet --->" + id_booklet);
                 String url_booklet = booklet.getString("url");
                 System.out.println("url_booklet --->" + url_booklet);
                 String created_at_booklet = booklet.getString("created_at");
                 System.out.println("created_at_booklet --->" + created_at_booklet);
                 String updated_at_booklet = booklet.getString("updated_at");
                 System.out.println("updated_at_booklet --->" + updated_at_booklet);
                 String title_booklet = booklet.getString("title");
                 System.out.println("title_booklet --->" + title_booklet);
                 String thumbnail_url = booklet.getString("thumbnail_url");
                 System.out.println("thumbnail_url --->" + thumbnail_url);
                 String document_url = booklet.getString("document_url");
                 System.out.println("document_url --->" + document_url);
                 String presented = booklet.getString("presented");
                 thebooketurl = presented;
                 System.out.println("presented --->" + presented);


            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();

    } 
    return null;
    }
}



@Override
public void onBackPressed() {
    finish();//go back to the previous Activity
    overridePendingTransition(R.anim.backin, R.anim.backout);  
}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
      ImageView bmImage;

      public DownloadImageTask(ImageView bmImage) {
          this.bmImage = bmImage;
      }

      protected Bitmap doInBackground(String... urls) {
          String urldisplay = urls[0];
          Bitmap myImage = null;
          try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            myImage = BitmapFactory.decodeStream(in);
          } catch (Exception e) {
              Log.e("Error", e.getMessage());
              e.printStackTrace();
          }
          myImage = Bitmap.createScaledBitmap(myImage, 300, 200, false);;
          return myImage;


      }

      protected void onPostExecute(Bitmap result) {
          bmImage.setImageBitmap(result);
      }
}
}

3 个答案:

答案 0 :(得分:0)

在第339行放置一个断点,看看有什么失败。错误的基本部分在这里:

Caused by: java.lang.NullPointerException
12-30 17:40:57.045: E/AndroidRuntime(26286):    at com.begital.votrebijoutier.ShopActivity$GetJson.doInBackground(ShopActivity.java:339)

我的猜测是你的数组为空。

答案 1 :(得分:0)

错误日志基本上说明了两件事:

  1. AsyncTask的doInBackground()函数调用发生了崩溃。
  2. 崩溃是由ShopActivity.java
  3. 第339行的NullPointerException引起的

    现在你在评论中发布了这一行:

    JSONObject jsonObject = array.getJSONObject(0);
    

    当发生空指针异常时,通常在您尝试在不存在的对象上调用函数时(为空)。在此特定代码行中,只有在array变量为空时才会发生。如果没有更多的代码可见性,我不能说更多。

答案 2 :(得分:0)

您不应该访问doInBackground中的任何UI元素,此方法在后台线程中运行。 那么doInBackground()&amp;中的网络操作也是如此。访问您的Buttons&amp; TextView中的onPostExecute()onProgressUpdate()中的publishProgress()来自doInBackground()