Strict Mode Android Block Guard Policy Hatası
-
Twitter4j Kütüphanesi kullanarak ufak bi uygulama geliştiriyorum Fakat StrictMode Hatası alıyorum .. Yaklaşık 3-4 saattir bakıyorum fakat bulamadım ...
KOD YAPISIConfigurationBuilder builder = new ConfigurationBuilder();
builder.setOAuthConsumerKey(pref.getString("CONSUMER_KEY", ""));
builder.setOAuthConsumerSecret(pref.getString("CONSUMER_SECRET", ""));
AccessToken accessToken = new AccessToken(pref.getString("ACCESS_TOKEN", ""), pref.getString("ACCESS_TOKEN_SECRET", ""));
Twitter twitter1 = new TwitterFactory(builder.build()).getInstance(accessToken);
User u1 = null ;
long cursor = -1;
IDs ids;
System.out.println("Listing followers's ids.");
try {
do {
ids = twitter1.getFollowersIDs(cursor); <<<<-------- HATA !!!! (Hatayı Şu Satırda Alıyorum tek tek debug ettim burda patlıyor proje)
for (long id : ids.getIDs()) {
System.out.println(id);
User user = twitter1.showUser(id);
System.out.println(user.getName());
Toast.makeText(getActivity(),user.getName(),Toast.LENGTH_LONG).show();
}
} while ((cursor = ids.getNextCursor()) != 0);
}catch (TwitterException et)
{
Toast.makeText(getActivity(),et.getMessage().toString(),Toast.LENGTH_LONG).show();
}Log Çıktısı Şu Şekilde
FATAL EXCEPTION: main
Process: com.mhmdalmz.myapplication, PID: 22695
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:755)
at com.android.okhttp.okio.Okio$1.write(Okio.java:76)
at com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:155)
at com.android.okhttp.okio.RealBufferedSink.flush(RealBufferedSink.java:221)
at com.android.okhttp.internal.http.HttpConnection.flush(HttpConnection.java:141)
at com.android.okhttp.internal.http.HttpTransport.finishRequest(HttpTransport.java:52)
at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:902)
at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:788)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:439)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java)
at twitter4j.HttpResponseImpl.<init>(HttpResponseImpl.java:35)
at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:143)
at twitter4j.HttpClientBase.request(HttpClientBase.java:53)
at twitter4j.HttpClientBase.get(HttpClientBase.java:71)
at twitter4j.TwitterImpl.get(TwitterImpl.java:1950)
at twitter4j.TwitterImpl.getFollowersIDs(TwitterImpl.java:413)
at com.mhmdalmz.myapplication.ProfileFragment$ShowUnfollow.onClick(ProfileFragment.java:95)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
-
herhangi bir id değeri koyup denedin mi?
belki kütüphane eskidir api çalışmıyordur?
id = xxxxxxx; System.out.println(id); User user = twitter1.showUser(id); System.out.println(user.getName()); Toast.makeText(getActivity(),user.getName(),Toast.LENGTH_LONG).show();
-
pSkpt bunu yazdı
herhangi bir id değeri koyup denedin mi?
belki kütüphane eskidir api çalışmıyordur?
id = xxxxxxx; System.out.println(id); User user = twitter1.showUser(id); System.out.println(user.getName()); Toast.makeText(getActivity(),user.getName(),Toast.LENGTH_LONG).show();
Hocam Tweet falan attırabiliyorum login vs. kütüphane eski değil
-
Main thread içinde network işlemi yapmaya çalıştığında alırsın o hayatı. Network işleminin olduğu kısmı bir thread ya da Asynctask içine alırsan problem düzelir.
-
-
hocam hatayı aldığın Activity'de onCreate fonksiyonu içinde super.onCreate(savedInstanceState) satırından hemen sonra şunları ekler misin düzelmesi lazım
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
ya da alternatif olarak JPriest hocamın dediği gibi AsyncTask ya da Thread içinde de yapabilirsin.
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
// burada network kısmını yapacaksın
} catch (Exception e) {
Log.e("blabla", e.getMessage());
}
));
thread.start();
gibisinden birşey, kodları direk buraya yazdım editorden geçmedi yanlışlar olabilir.
manyaki tarafından 17/Oca/16 14:51 tarihinde düzenlenmiştir -
Çok teşekkürler Thread ile yaptımda Daha önce çok yaptım böyle hiç hata almamıştım da android studio da öyle demekki Eclipsede hiç karşılaşmadım yada kodlar farklı :)
Teşekkür ederim yardımınız için@manyaki
@DuPi
@JPriest -
Bir önceki cevabı mobilden yazmıştım detay verememiştim.
Kodlar farklı değil. İşin Android Studio ya da Eclipse ile de alakası yok. Android SDK lvl 9'dan sonra bu zorunluluk haline geldi. Main thread içinde network başta olmak üzere uzun süren işlemler yapmamak gerekiyor. UX için de çok kötü bir etkisi vardı zaten. Kocaman dialoglar çıkıyordu eskiden her işlemde, "Yükleniyor, lütfen bekleyiniz.." vs. Şurdaki blog yazısında biraz bahsedilmiş, ama çözüm olarak sunduğu yöntem kesinlikle doğru bir yöntem değil, uzak durulmalı. http://www.lucazanini.eu/en/2012/android/the-android-os-networkonmainthreadexception-exception/
İçinde bunun da olduğu birden fazla seçenek var bunun için. Aralarında kötünün iyisi olabilecek en uygun seçenek AsyncTask. İkinci seçenek Thread ya da Runnable interface'i. Üçüncü seçenek için de StrictMode.. Şuradaki en popüler üç cevap da bunları içeriyor zaten: http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception
Şu cevabın altındaki yorumlarda da adamı iyice dövmüşler zaten: http://stackoverflow.com/a/9289190/637724
İyi çalışmalar.
JPriest tarafından 18/Oca/16 09:17 tarihinde düzenlenmiştir -
JPriest bunu yazdı
Bir önceki cevabı mobilden yazmıştım detay verememiştim.
Kodlar farklı değil. İşin Android Studio ya da Eclipse ile de alakası yok. Android SDK lvl 9'dan sonra bu zorunluluk haline geldi. Main thread içinde network başta olmak üzere uzun süren işlemler yapmamak gerekiyor. UX için de çok kötü bir etkisi vardı zaten. Kocaman dialoglar çıkıyordu eskiden her işlemde, "Yükleniyor, lütfen bekleyiniz.." vs. Şurdaki blog yazısında biraz bahsedilmiş, ama çözüm olarak sunduğu yöntem kesinlikle doğru bir yöntem değil, uzak durulmalı. http://www.lucazanini.eu/en/2012/android/the-android-os-networkonmainthreadexception-exception/
İçinde bunun da olduğu birden fazla seçenek var bunun için. Aralarında kötünün iyisi olabilecek en uygun seçenek AsyncTask. İkinci seçenek Thread ya da Runnable interface'i. Üçüncü seçenek için de StrictMode.. Şuradaki en popüler üç cevap da bunları içeriyor zaten: http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception
Şu cevabın altındaki yorumlarda da adamı iyice dövmüşler zaten: http://stackoverflow.com/a/9289190/637724
İyi çalışmalar.
hocam kaynaklar için de çok teşekkür ederim :)
