برنامه نویسی رو با هم یاد می‌گیریم

تو این بلاگ می‌خوام در مورد برنامه نویسی بگم براتون،بعضی وقتا هم جاهای باحال تفریحی

برنامه نویسی رو با هم یاد می‌گیریم

تو این بلاگ می‌خوام در مورد برنامه نویسی بگم براتون،بعضی وقتا هم جاهای باحال تفریحی

  • ۰
  • ۰

چگونه می‌توان کد کاتلین را به جاوا تبدیل کرد؟

در IntelliJ یا Android Studio، برای تبدیل کد kotlin به جاوا، کافی است کارهای زیر را انجام دهید:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. بر روی  Decompile کلیک کنید.
  3.  فایل جاوا را کپی کنید.

در نسخه‌های 1.2 به بعد افزونه Kotlin، می توانید مستقیماً از مسیر زیر استفاده کنید.

Menu > Tools > Kotlin -> Decompile Kotlin to Java.

  • ۱
  • ۰

برای lazy load کردن تصاویر در listview روش های متفاوتی وجود دارد، در ادامه به آموزش دو روش آن می‌پردازیم.

روش اول

این کد برای نگه داشتن تصاویری که برنامه در حال نمایش است نوشته شده است. توجه داشته باشید که شیء "Log" مورد استفاده در اینجا custom wrapper در کلاس Log نهایی در اندروید است.

package com.wilson.android.library;

/*
 Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/
import java.io.IOException;

public class DrawableManager {
    private final Map<String, Drawable> drawableMap;

    public DrawableManager() {
        drawableMap = new HashMap<String, Drawable>();
    }

    public Drawable fetchDrawable(String urlString) {
        if (drawableMap.containsKey(urlString)) {
            return drawableMap.get(urlString);
        }

        Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
        try {
            InputStream is = fetch(urlString);
            Drawable drawable = Drawable.createFromStream(is, "src");


            if (drawable != null) {
                drawableMap.put(urlString, drawable);
                Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
                        + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
                        + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
            } else {
              Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
            }

            return drawable;
        } catch (MalformedURLException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        } catch (IOException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        }
    }

    public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
        if (drawableMap.containsKey(urlString)) {
            imageView.setImageDrawable(drawableMap.get(urlString));
        }

        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message message) {
                imageView.setImageDrawable((Drawable) message.obj);
            }
        };

        Thread thread = new Thread() {
            @Override
            public void run() {
                //TODO : set imageView to a "pending" image
                Drawable drawable = fetchDrawable(urlString);
                Message message = handler.obtainMessage(1, drawable);
                handler.sendMessage(message);
            }
        };
        thread.start();
    }

    private InputStream fetch(String urlString) throws MalformedURLException, IOException {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet(urlString);
        HttpResponse response = httpClient.execute(request);
        return response.getEntity().getContent();
    }
}

روش دوم:

LazyList چیست؟

LazyList یک کتابخانه ساده برای نمایش تصاویر در Android ListView است.

نحوه استفاده:

ImageLoader imageLoader=new ImageLoader(context);
...
imageLoader.DisplayImage(url, imageView);

فراموش نکنید که مجوزهای زیر را به AndroidManifest.xml خود اضافه کنید:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

تنها یک نمونه از ImageLoader ایجاد کنید و از آن در سراسر برنامه خود استفاده کنید. به این ترتیب کش کردن تصاویر بسیار کارآمدتر خواهد بود.

نحوه عملکرد این روش:

در این روش تصاویر در thread پس زمینه دانلود می‌شود. تصاویر روی کارت SD و در حافظه کش ذخیره می شوند. اجرای کش بسیار ساده است و فقط برای نسخه ی demo کافی است. من تصاویر را با inSampleSize رمزگشایی می کنم تا استفاده از memory را کاهش دهم.

  • ۰
  • ۰

برای انتقال داده ها بین Activities در برنامه اندروید باید session id برای activityها در دسترس باشد.

چگونه می‌توان session id را برای همه activityها در دسترس نگه داشت؟

روش اول:

در فعالیت فعلی خود، یک Intent جدید ایجاد کنید:

String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);    
i.putExtra("key",value);
startActivity(i);

 

سپس در Activity جدید، این مقادیر را بازیابی کنید:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

 

از این تکنیک برای انتقال متغیرها از یک Activity به دیگری استفاده کنید.

روش دوم:

همچنین می‌توانید از روش زیز استفاده کنید.

ساده ترین راه برای انجام این کار این است که session id را به signout در Intent که برای شروع Activity استفاده می کنید، ارسال کنید:

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

 

و در Activity بعدی به آن intent دسترسی داشته باشید:

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

 

  • ۰
  • ۰

چگونه یک دستگاه اندرویدی را به لرزش درآوریم؟

در این مقاله می‌خواهیم نحوه به ارزش درآوردن گوشی اندروید با برنامه نویسی اندروید را آموزش دهیم.

1-اجازه ویبره را به اپلیکشین دهید

قبل از شروع اجرای هر کد ارتعاشی، باید به برنامه خود اجازه ارتعاش بدهید:

<uses-permission android:name="android.permission.VIBRATE"/>

 

مطمئن شودی که این کد را در فایل AndroidManifest.xml خود قرار دهید.

2- کتابخانه Vibration را وارد کنید

بیشتر IDE ها این کار را می‌کنند اما اگر احیانا IDE شما این کار را انجام نداد 

 import android.os.Vibrator;



را اضافه کنید.

مطمئن شوید که کد را در قسمتی که می‌خواهید لرزش در آن رخ دهد، قرار دهید.

3- چگونه می‌توان ویبره را در زمان مشخصی انجام داد

در بیشتر مواقع، می خواهید دستگاه را برای مدت زمان کوتاه و از پیش تعیین شده ای ویبره کنید. شما می توانید با استفاده از روش vibrate(long milliseconds) به این هدف برسید.به مثال زیر توجه کنید:

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Vibrate for 400 milliseconds
v.vibrate(400);

 

4- چگونه زمان وییزه را بی نهایت کنیم

ممکن است بخواهید دستگاه به طور نامحدود به لرزش ادامه دهد. برای این کار از روش vibrate(long[] pattern, int repeat) استفاده می کنیم:

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Start without a delay
// Vibrate for 100 milliseconds
// Sleep for 1000 milliseconds
long[] pattern = {0, 100, 1000};

// The '0' here means to repeat indefinitely
// '0' is actually the index at which the pattern keeps repeating from (the start)
// To repeat the pattern from any other point, you could increase the index, e.g. '1'
v.vibrate(pattern, 0);

 

و هنگامی که می‌خواهید لرزش متوقف شود،cancel()را فراخوانی کنید:

v.cancel();

5- ویبره به صورت الگوهای تکرار شونده

اگر می‌خواهید لرزش با سلیقه خود داشته باشید، می‌توانید الگوهای ارتعاشی خود را ایجاد کنید:

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Start without a delay
// Each element then alternates between vibrate, sleep, vibrate, sleep...
long[] pattern = {0, 100, 1000, 300, 200, 100, 500, 200, 100};

// The '-1' here means to vibrate once, as '-1' is out of bounds in the pattern array
v.vibrate(pattern, -1);

 

عیب‌یابی

اگر با اعمال کدها دستگاه شما به لرزش درنمی‌آید، ابتدا مطمئن شوید گوشی شما چنین قابلیتی دارد:

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Output yes if can vibrate, no otherwise
if (v.hasVibrator()) {
    Log.v("Can Vibrate", "YES");
} else {
    Log.v("Can Vibrate", "NO");
}

 

سپس مطمئن شوید که به اپلیکیشن خود اجازه ویبره را داده اید. (مرحله 1)

<uses-permission android:name="android.permission.VIBRATE"/>

 

  • ۰
  • ۰

PECS (Producer Extends Consumer Super)

 اگر فقط اقلامی را از یک مجموعه عمومی می‌کشید، این یک تولیدکننده است و باید از extends استفاده کنید. اگر فقط اقلام را داخل آن پر می کنید، مصرف کننده است و باید از super استفاده کنید. اگر هر دو را با یک مجموعه انجام می دهید، نباید از extends  یا super  استفاده کنید.

فرض کنید متدی دارید که مجموعه‌ای از چیزها را به عنوان پارامتر خود در نظر می‌گیرد، اما می‌خواهید انعطاف‌پذیرتر از پذیرش یک Collection<? extends Thing>باشد.

مورد 1: می خواهید مجموعه را مرور کنید و با هر مورد کارهایی انجام دهید.

در این صورت لیست یک تولید کننده است، بنابراین باید از یک Collection<? extends Thing> استفاده کنید.

دلیلش این است که یک مجموعه Collection<? extends Thing> می‌تواند هر زیرگروهی از Thing را در خود جای دهد، و بنابراین هر عنصر زمانی که عملیات خود را انجام می‌دهید مانند یک Thing رفتار می‌کند. (شما در واقع نمی توانید چیزی (به جز null) را به یک مجموعه Collection<? extends Thing> اضافه کنید، زیرا در زمان اجرا نمی توانید بدانید که کدام زیرگروه خاصی از Thing در مجموعه وجود دارد.

مورد 2: می خواهید چیزهایی را به مجموعه اضافه کنید.

در این صورت لیست یک مصرف کننده است، بنابراین باید از یک Collection<? super Thing> استفاده کنید.

دلیلش در اینجا آن است که برخلاف مجموعه Collection<? extends Thing>، مجموعه Collection<? super Thing> همیشه می تواند یک Thing را بدون توجه به نوع پارامتر واقعی آن نگه دارد. در اینجا برای شما مهم نیست که چه چیزی قبلاً در لیست است تا زمانی که اجازه می دهد یک Thing اضافه شود. این چیزی است که ? super Thing تضمین می کند.

اصول PECS در علوم کامپیوتر

  • Covariance: ? extends MyClass,
  • Contravariance: ? super MyClass and
  • Invariance/non-variance: MyClass

تصویر زیر این مفهوم را توضیح می‌دهد:

pecs در جاوا

"PECS" is from the collection's point of view. If you are only pulling items from a generic collection, it is a producer and you should use extends; if you are only stuffing items in, it is a consumer and you should use super. If you do both with the same collection, you shouldn't use either extends or super.

  • ۰
  • ۰

چگونه می‌توان رشته‌ها را در جاوا مقایسه کرد؟

== برای تست کردن برابری مرجع به کار می‌‌رود. (خواه آنها یک شی باشند).

.equals () برابری مقدار را تست می‌کند (خواه از نظر منطقی "برابر" باشند).

Objects.equals () قبل از فراخوانی، .equals() را برای null بررسی می‌کند.

در نتیجه، اگر می خواهید تست کنید که آیا دو رشته دارای مقدار یکسانی هستند یا خیر، بهتر است که از Objects.equals (). استفاده کتید.

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

 

در بیشتر مواقع بهتر است از Objects.equals (). اما در شرایط نادری که می دانید با رشته‌های داخلی سروکار دارید، می‌توانید از == استفاده کنید.

بهتر است بدانید که . . .

String.equalsIgnoreCase() حروف کوچک و بزرگ را نادیده می گیرد و وقتی تفاوت دو مقدار فقط در حروف کوچک و بزرگ باشد با خطا مواجه می‌شوید. همچنین مراقب باشید که این روش ممکن است نتایج غیرمنتظره‌ای در موارد مختلف مرتبط زبان‌های غیر انگلیسی داشته باشد.

String.contentEquals () محتوای String را با محتوای هر CharSequence (در جاوا 1.5 به بعد) مقایسه می‌کند که شما را از تبدیل StringBuffer و غیره به رشته قبل از انجام مقایسه نجات می‌دهد، اما بررسی null را به شما واگذار می‌کند.

  • ۰
  • ۰

stack trace چیست؟

stack trace فهرستی از فراخوانی‌های متد است که وقتی Exception رخ داده، اپلیکیشن در وسط آن بوده.

این بسیار مفید است زیرا نه تنها به شما نشان می دهد که خطا کجا رخ داده است، بلکه نحوه پایان برنامه در آن مکان کد را نیز نشان می دهد. این منجر به سوال بعدی می شود:

 

مثال ساده‌ای از stack trace

با مثالی که در سوال داده شد، می‌توانیم دقیقاً مشخص کنیم که این استثنا در کجای برنامه رخ داده است. بیایید نگاهی به stack trace بیندازیم:

 

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

 

این یک stack trace بسیار ساده است. اگر از ابتدای لیست "at ..." شروع کنیم، می توانیم بگوییم که خطای ما کجا رخ داده است. آنچه ما به دنبالش هستیم بالاترین «فراخوانی متد» است که بخشی از برنامه ما است. در این مورد:

 

at com.example.myproject.Book.getTitle(Book.java:16)

 

برای رفع این ارور، می‌توانیم Book.java را باز کرده و به خط 16 نگاه کنیم که عبارت است از:

 

15   public String getTitle() {
16      System.out.println(title.toString());
17      return title;
18   }

 

این نشان می دهد که چیزی (احتمالا عنوان) در کد بالا تهی است.

 

آموزش نحوه دیباگ کردن اپلیکیشن با آنالیز کردن stack trace

گاهی اوقات برنامه‌ها یک Exception را می‌گیرند و دوباره آن را به‌عنوان علت یک exception دیگر نشان می‌دهند. که به طور معمول اینگونه به نظر می رسد:

 

34   public void getBookIds(int id) {
35      try {
36         book.getId(id);    // this method it throws a NullPointerException on line 22
37      } catch (NullPointerException e) {
38         throw new IllegalStateException("A book has a null property", e)
39      }
40   }

 

که ممکن است به شما یک stack trace شبیه مثال زیر دهد:

 

Exception in thread "main" java.lang.IllegalStateException: A book has a null property
        at com.example.myproject.Author.getBookIds(Author.java:38)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
        at com.example.myproject.Book.getId(Book.java:22)
        at com.example.myproject.Author.getBookIds(Author.java:36)
        ... 1 more

 

چیزی که در مورد این مورد متفاوت است "Caused by" است. گاهی اوقات Exception  ها دارای چندین بخش "Caused by" هستند. برای این موارد، شما معمولاً می خواهید «علت اصلی» (root cause) را پیدا کنید، که یکی از پایین ترین بخش های «Caused by» در ردیابی stack trace خواهد بود. که در این مورد:

 

Caused by: java.lang.NullPointerException <-- root cause
        at com.example.myproject.Book.getId(Book.java:22) <-- important line

 

، با این Exception، می خواهیم به خط 22 Book.java نگاه کنیم تا ببینیم چه چیزی ممکن است باعث NullPointerException شود.

 

آنالیز و رفع ارور با استفاده از کد کتابخانه

معمولا stack traceها بسیار پیچیده تر از دو مثال بالا هستند. در اینجا یک مثال آورده شده است (مثالی طولانی که چندین سطح از استثناهای زنجیره ای را نشان می دهد):

 

javax.servlet.ServletException: Something bad happened
    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.example.myproject.ExceptionHandlerFilter.doFilter(ExceptionHandlerFilter.java:28)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.example.myproject.OutputBufferFilter.doFilter(OutputBufferFilter.java:33)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: com.example.myproject.MyProjectServletException
    at com.example.myproject.MyServlet.doPost(MyServlet.java:169)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:30)
    ... 27 more
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.example.myproject.MyEntity]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:64)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
    at $Proxy19.save(Unknown Source)
    at com.example.myproject.MyEntityService.save(MyEntityService.java:59) <-- relevant call (see notes below)
    at com.example.myproject.MyServlet.doPost(MyServlet.java:164)
    ... 32 more
Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
    at org.hsqldb.jdbc.Util.throwError(Unknown Source)
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
    ... 54 more

 

در این مثال، موارد بسیار بیشتری وجود دارد. چیزی که ما بیشتر نگران آن هستیم این است که به دنبال methodهایی باشیم که از کد ما هستند، که می تواند هر چیزی در com.example.myproject باشد.

از مثال دوم (بالا)، ابتدا می‌خواهیم علت اصلی آن را بررسی کنیم:

Caused by: java.sql.SQLException

 

به هر حال، همه فراخوانی‌های متد تحت آن کد کتابخانه هستند. بنابراین ما به سمت "Caused by" بالای آن حرکت می کنیم و در بلوک "Caused by" به دنبال اولین فراخوانی متد نشأت گرفته از کد ما باشید که عبارت است از:

at com.example.myproject.MyEntityService.save(MyEntityService.java:59)

 

مانند نمونه‌های قبلی، ما باید به MyEntityService.java در خط 59 نگاه کنیم، زیرا این خطا از آنجا نشأت گرفته است (در این مثال هم کمی واضح است که چه اشتباهی رخ داده است، زیرا SQLException خطا را بیان می‌کند، اما روش اشکال‌زدایی همان چیزی است که ما دنبال می‌کنیم).

  • ۰
  • ۰

سوالات زیادی وجود دارد مبنی بر اینکه برنامه آنها از کار افتاده است. هدف این سوال آموزش برنامه نویسان مبتدی اندروید است که چگونه سعی کنند مشکلات خود را خودشان برطرف کنند یا سوالات درست را بپرسند.

 

دلیل این ارور چیست؟

برنامه شما بخاطر RuntimeException پیش بینی نشده از کار افتاده است. و در بیشتر اوقات بخاطر NullPointerException است.

 

چگونه می‌توان ارور «Unfortunately MyApp has stopped» را رفع کرد؟

هر بار که یک اپلیکیشن اندروید هنگ می‌کند، یک Stack Trace روی کنسول نوشته می شود (در این مورد، logcat). این Stack Trace حاوی اطلاعات حیاتی برای حل مشکل شما است.

 

1- پیدا کردن stack trace در Android Studio

در نوار پایین پنجره، روی دکمه Logcat کلیک کنید. همچنین می توانید alt+6 را فشار دهید. مطمئن شوید که شبیه ساز یا دستگاه شما در پانل Devices انتخاب شده است. در مرحله بعد سعی کنید stack trace را پیدا کنید که با رنگ قرمز نشان داده شده است. ممکن است موارد زیادی به logcat وارد شده باشد، بنابراین شاید لازم باشد کمی اسکرول کنید. یک راه آسان برای یافتن stack trace این است که logcat را پاک کنید (با استفاده از سطل بازیافت سمت راست)، و اجازه دهید برنامه دوباره هنگ کند.

 

رفع ارور Unfortunately, MyApp has stopped.

 

2- دیباگ کردن اپلیکیشن با Stack Trace

پیدا کردن مشکل نیمی از موفقیت است. در این مرحله باید با تجزیه و تحلیل stack trace دریابید که دقیقا چه چیزی باعث خرابی اپلیکیشن شما شده است.

 

مشکل برطرف نشده؟

اگر Exception و خطی را که در آن رخ داده است پیدا کرده‌اید و هنوز نمی‌توانید نحوه رفع آن را بیابید، در StackOverflow سوال  خود ر مطرح کنید.

سعی کنید تا حد امکان مختصر باشید: stack trace و کد مربوطه را از چند خط قبل‌تر از Exception ارسال کنید.

  • ۰
  • ۰

به گزارش ایسنا:

چنانچه نگاهی به لیست پردرآمدترین مشاغل در تمام دنیا بیاندازید، حتماً نام شغل برنامه‌نویسی را در بین اسامی این شغل‌ها ملاحظه خواهید کرد.

به گزارش ایسنا، بنابر اعلام مکتب خونه، همین خصوصیت این حرفه‌ی تخصصی می‌تواند بسیار وسوسه‌کننده باشد تا شما را ترغیب به یادگیری نماید و به‌طورقطع اولین سؤالی که ذهن شما را درگیر خواهد کرد، این است که «چگونه برنامه‌نویسی را شروع کنیم؟» که البته سؤال بسیار مناسب و هوشمندانه‌ای می‌باشد؛ چرا که با رسیدن به پاسخ این پرسش مسیر برایتان کاملاً روشن خواهد شد و وقتتان به هدر نخواهد رفت، پس قدم‌به‌قدم با این مطلب همراه باشید.

 

آموزش برنامه‌نویسی در کدام زمینه؟

بعد از اطمینان پیداکردن از داشتن علاقه و حوصله برای یادگیری برنامه‌نویسی، باید زمینه‌ای که مایل به یادگیری برنامه‌نویسی برای آن می‌باشید را مشخص کنید:

۱- برنامه‌نویسی برای دسکتاپ

۲- برنامه‌نویسی برای وب

۳- برنامه‌نویسی برای موبایل

 

برنامه‌نویسی برای دسکتاپ

برنامه‌نویسی برای دسکتاپ تمام برنامه‌های کاربردی‌ای را که می‌شود داخل رایانه (کامپیوتر) نصب کرد و با اجرای آن‌کاره‌ای مختلف را انجام داد، شامل می‌شود؛ برنامه‌هایی مثل نرم‌افزارهای حسابداری، انبارداری، اتوماسیون اداری و ....

 

برنامه‌نویسی برای وب و آموزش طراحی سایت

برنامه‌نویسی برای وب هم طراحی سایت و هم برنامه‌های تحت وب را در برمی‌گیرد که دراین‌بین آموزش طراحی سایت یکی از محبوب‌ترین دوره‌های آموزشی است، چراکه پس از طی کردن این دوره‌ی آموزشی و با به کار بستن خلاقیت، می‌تواند درآمد بسیاری را برای شما به همراه داشته باشد.

 

 

 

برنامه‌نویسی برای موبایل و آموزش اندروید

فراگیر بودن استفاده از سیستم‌عامل اندروید سبب شده تا بسیاری از اپلیکیشن‌ها برای اندروید ساخته شود و سهم سیستم‌عامل IOS بسیار کم‌تر باشد، به همین دلیل آموزش اندروید نیز یکی از حوزه‌های یادگیری فناوری و مسیر ورود به یک حوزه‌ی کاری طلایی برای برنامه‌نویس‌ها می‌باشد تا با تولید اپلیکیشن‌های اندرویدی به کسب درآمد پرداخته، حتی گاهی تبدیل به یک سرمایه‌دار بزرگ شوند؛ در واقع برنامه‌نویسی برای موبایل این امکان را در اختیار برنامه‌نویس قرار می‌دهد تا از دانش خود بهره گرفته، طبق نیازهای کاربران و بر اساس سلیقه‌ی عموم، اپلیکیشن‌هایی را طراحی نماید که با انجام این کار هم نیازهای کاربران رفع خواهد شد و هم منفعت اقتصادی قابل‌توجهی را نصیب برنامه‌نویس خواهد کرد.

یکی دیگر از مزایای آموزش اندروید این است که به علاقه‌مندان این امکان را می‌دهد تا ایده‌های خود را طبق سلیقه و خواست خود طراحی کرده، به اجرا درآورند و نیازی به ارائه‌ی ایده‌ی خود به دیگران و دریافت نتیجه‌ای متفاوت با خواست خود را نخواهند داشت؛ چرا که ایده و اجرا هم‌زمان با خود آن‌ها می‌باشد و می‌توانند به‌سادگی وارد بازار بزرگ تولید اپلیکیشن در عرصه‌ی گسترده‌ی فضای مجازی شوند؛ فضایی که روزبه‌روز متنوع‌تر می‌شود.

 

کدام زمینه بهتر است؟

بعد از مطالعه‌ی موارد بالا حتماً متوجه خواهید شد که در کدام زمینه علاقه به فعالیت دارید و همچنین درآمدزایی کدام حوزه بیشتر می‌باشد، اما اصلا نگران این موضوع نباشید که مثلا اگر برنامه‌نویسی موبایل را انتخاب کردید و بعد خواستید برنامه‌نویسی وب را انجام بدهید، چه می‌شود؟ تنها کاری که باید بکنید یادگیری دانشی است که برای برنامه‌نویسی وب لازم است، ولی برای شروع کار بهتر این است که آنچه موردعلاقه‌ی خودتان می‌باشد را انتخاب کنید.

 

آموزش برنامه‌نویسی با کدام زبان برنامه‌نویسی؟

شاید این فکر به ذهن علاقه‌مندان به یادگیری برنامه‌نویسی برسد که برای یک برنامه‌نویس حرفه‌ای شدن همه‌ی زبان‌های برنامه‌نویسی را با هم باید یاد گرفت، اما نه‌تنها با اقدام به انجام این کار هیچ نتیجه‌ای حاصل نخواهد شد، بلکه حتماً برنامه‌نویسی را کنار گذاشته، از آن دل‌زده نیز خواهید شد؛ بنابراین به دلیل این‌که اساس بیش‌تر زبان‌های برنامه‌نویسی مانند یکدیگر می‌باشد، می‌توانید ابتدا به یک‌ زبان برنامه‌نویسی مسلط شوید و بعد اقدام به یادگیری یک‌زبان دیگر کنید.

 

۸ زبان برنامه‌نویسی مطرح دنیا

زبان‌های برنامه‌نویسی مطرح دنیا زبان‌های برنامه‌نویسی پایتون (Python)، پی اچ پی (PHP)، جاوا (Java)، جاوا اسکریپت (Java Script)، سی پلاس پلاس (++C)، اِی اِس پی دات ‌نِت (ASP.Net)، سی شارپ (#C) و روبی (Ruby) می باشند.

 

شروع برنامه‌نویسی با آموزش پایتون

همان‌طور که گفته شد یکی از زبان‌های متن‌باز برنامه‌نویسی، پایتون (python) می‌باشد. از آن‌ جهت آموزش پایتون برای شروع برنامه‌نویسی می‌تواند گزینه‌ی مناسبی باشد که پایتون یک‌زبان برنامه‌نویسی بسیار ساده و درعین‌ حال قدرتمند می‌باشد که قابلیت استفاده در همه‌جا را دارا بوده، یادگیری آن در کوتاه‌ترین زمان ممکن امکان‌پذیر است.

  • ۰
  • ۰

داستان اتاق فرار اهریمن:

اهریمنان موجوداتی هستند که از نور فرار می‌کنند و توانایی تحمل آن را ندارند. آنان برای عملی کردن نقشه‌های خود از انسان‌ها استفاده می‌کنند و از آن‌ها برای کشتن یکدیگر استفاده می‌کنند. پس از گذشت قرن‌ها دوباره اهریمنان بازگشته‌اند و این بار ساکنان خانه‌ای را تسخیر کرده‌اند. . .
 
اتاق فرار اهریمن
 

رزرو اتاق فرار اهریمن

این اتاق فرار توسط مجموعه www.blackescape.ir ایجاد شده است و می‌توانید برای روزهای شنبه تا جمعه 16:30 ، 18:00 ، 19:30 ، 21:00 ، 22:30 این اتاق فرار را رزرو کنید.
 
آدرس مجموعه black escape: تهران, شمس آباد
خیابان استاد حسن بنا – بالاتر از میدان ملّت – نبش پیچ شمس آباد – پلاک 2 – واحد 2
 
شما برای رزرو اتاق فرار اهریمن می‌توانید از طریق مجموعه آل اسکیپ اقدام کنید.