Отладка Android ddms против отладчика затмения / код не работает на Android 4.0 - PullRequest
0 голосов
/ 23 ноября 2011

пытался выяснить, почему мой код не работает в новом эмуляторе 4.0 уже несколько дней и, похоже, не может до конца разобраться, мой код, который прекрасно работает в 2.2 sdk, вообще не работает в 4.0 SDK эмулятор, в результате этого я пытался отследить некоторые учебники по отладке, но, похоже, не могу получить четкое объяснение того, какой из них лучше или, откровенно говоря, ясный способ выполнения функций, так Вопрос в том, что лучше, и как лучше это сделать?

Обновление:

Исключения:

11-23 10:16:34.655: E/AndroidRuntime(1358): java.lang.RuntimeException:
        Unable to resume activity {com.testapp2.second/com.testapp2.second.activities.AuthorizationActivity}: android.os.NetworkOnMainThreadException
11-23 10:16:34.655: E/AndroidRuntime(1358): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2443)

вот мой код: activity1:

package com.testapp2.second.activities;

import com.testapp2.second.OTweetApplication;
import com.testapp2.second.R;

import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;

public class Testapp2Activity extends ListActivity {

private Twitter twitter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (OTweetApplication)getApplication();
twitter = app.getTwitter();

setContentView(R.layout.main);
}

@Override
protected void onResume() {
super.onResume();
if (!app.isAuthorized()) {
  beginAuthorization();
} else {
  loadTimelineIfNotLoaded();
}
}

private void loadTimelineIfNotLoaded() {
loadHomeTimeline();
}

private void beginAuthorization() {
Intent intent = new Intent(this, AuthorizationActivity.class);
startActivity(intent);
}

private void loadHomeTimeline() {
try {
  ResponseList<Status> statii = twitter.getHomeTimeline();
  StatusListAdapter adapter = new StatusListAdapter(this, statii);
  setListAdapter(adapter);
} catch (TwitterException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
}

private class StatusListAdapter extends ArrayAdapter<Status> {

public StatusListAdapter(Context context, ResponseList<Status> statii) {
  super(context, android.R.layout.simple_list_item_1, statii);
}

}
}

мероприятие 2:

package com.testapp2.second.activities;

import com.testapp2.second.OTweetApplication;
import com.testapp2.second.R;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class AuthorizationActivity extends Activity {

private OTweetApplication app;
private WebView webView;

private WebViewClient webViewClient = new WebViewClient() {
@Override
public void onLoadResource(WebView view, String url) {
  // the URL we're looking for looks like this:
  // http://otweet.com/authenticated?oauth_token=1234567890qwertyuiop
  Uri uri = Uri.parse(url);
  if (uri.getHost().equals("otweet.com")) {
    String token = uri.getQueryParameter("oauth_token");
    if (null != token) {
      webView.setVisibility(View.INVISIBLE);
      app.authorized();
      finish();
    } else {
      // tell user to try again 
    }
  } else {
    super.onLoadResource(view, url);
  }
 }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (OTweetApplication)getApplication();
setContentView(R.layout.authorization_view);
setUpViews();
}

@Override
protected void onResume() {
super.onResume();
String authURL = app.beginAuthorization();
webView.loadUrl(authURL);
}

private void setUpViews() {
webView = (WebView)findViewById(R.id.web_view);
webView.setWebViewClient(webViewClient);
}

}

расширенное применение:

package com.testapp2.second;

import com.testapp2.second.authorization.OAuthHelper;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import android.app.Application;

public class OTweetApplication extends Application {

private Twitter twitter;
private RequestToken currentRequestToken;
private OAuthHelper oAuthHelper;

@Override
public void onCreate() {
super.onCreate();
oAuthHelper = new OAuthHelper(this);
twitter = new TwitterFactory().getInstance();
oAuthHelper.configureOAuth(twitter);
}

public Twitter getTwitter() {
return twitter;
}

public boolean isAuthorized() {
return oAuthHelper.hasAccessToken();
}

public String beginAuthorization() {
try {
  if (null == currentRequestToken) {
    currentRequestToken = twitter.getOAuthRequestToken();
  }
  return currentRequestToken.getAuthorizationURL();
} catch (TwitterException e) {
  e.printStackTrace();
}
return null;
}

public boolean authorize(String pin) {
try {
  AccessToken accessToken = twitter.getOAuthAccessToken(currentRequestToken, pin);
  oAuthHelper.storeAccessToken(accessToken);
  return true;
} catch (TwitterException e) {
  throw new RuntimeException("Unable to authorize user", e); 
}
}

public void authorized() {
try {
  AccessToken accessToken = twitter.getOAuthAccessToken();
  oAuthHelper.storeAccessToken(accessToken);
} catch (TwitterException e) {
  throw new RuntimeException("Unable to authorize user", e); 
}

}

}

oauth helper:

package com.testapp2.second.authorization;

import java.io.InputStream;
import java.util.Properties;

import com.testapp2.second.R;

import twitter4j.Twitter;
import twitter4j.auth.AccessToken;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

public class OAuthHelper {

private static final String APPLICATION_PREFERENCES = "app_prefs";
private static final String AUTH_KEY = "auth_key";
private static final String AUTH_SEKRET_KEY = "auth_secret_key";
private SharedPreferences prefs;
private AccessToken accessToken;
private String consumerSecretKey;
private String consumerKey;
private Context context;

public OAuthHelper(Context context) {
this.context = context;
prefs = context.getSharedPreferences(APPLICATION_PREFERENCES, Context.MODE_PRIVATE);
loadConsumerKeys();
accessToken = loadAccessToken();
}

public void configureOAuth(Twitter twitter) {
twitter.setOAuthConsumer(consumerKey, consumerSecretKey);
twitter.setOAuthAccessToken(accessToken);
}

public boolean hasAccessToken() {
return null != accessToken;
}

public void storeAccessToken(AccessToken accessToken) {
Editor editor = prefs.edit();
editor.putString(AUTH_KEY, accessToken.getToken());
editor.putString(AUTH_SEKRET_KEY, accessToken.getTokenSecret());
editor.commit();
this.accessToken = accessToken;
}

private AccessToken loadAccessToken() {
String token = prefs.getString(AUTH_KEY, null);
String tokenSecret = prefs.getString(AUTH_SEKRET_KEY, null);
if (null != token && null != tokenSecret) {
  return new AccessToken(token, tokenSecret);
} else {
  return null;
}
}

private void loadConsumerKeys() {
try {
  Properties props = new Properties();
  InputStream stream = context.getResources().openRawResource(R.raw.oauth);
  props.load(stream);
  consumerKey = (String)props.get("consumer_key");
  consumerSecretKey = (String)props.get("consumer_secret_key");
} catch (Exception e) {
  throw new RuntimeException("Unable to load consumer keys from oauth.properties", e);
}
}
}

манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.testapp2.second"
android:versionCode="1"
android:versionName="1.0" >

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Light"
    android:name=".OTweetApplication" >
    <activity
        android:label="@string/app_name"
        android:name=".activities.Testapp2Activity" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".activities.AuthorizationActivity"      android:label="@string/authorization" />
</application>
<uses-sdk android:minSdkVersion="14" />

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

</manifest>

Ответы [ 3 ]

1 голос
/ 23 ноября 2011

Первое исключение говорит обо всем: NetworkOnMainThreadException

Вы никогда не должны заниматься сетевыми вещами в потоке пользовательского интерфейса. Вы должны сделать это в Thread / AsyncTask.

Если вы предоставите нам код своей деятельности, мы можем сказать вам, что вы должны изменить.

Обновление:

В вашем onResume() из AuthorizationActivity вы звоните app.beginAuthorization();, который может вызывать twitter.getOAuthRequestToken(), который, насколько я видел в API twitter4j, устанавливает сетевые подключения. Так что этого не следует делать в onResume(), который выполняется в потоке пользовательского интерфейса / основном потоке.

Мой совет: сделайте твиттер-коммуникацию / аутентификацию в AsyncTask, так как вы никогда не знаете, насколько быстрым или медленным может быть соединение. Вы должны проверить свое текущее приложение, имея медленное соединение. Я полагаю, вы можете получить медленный ответ от вашего приложения и / или сообщение application not responding.

Прочтите это для получения дополнительной информации: Проектирование для отзывчивости

Причина, по которой он работал ниже 4.0, заключалась в следующем: он был представлен в API 11: NetworkOnMainThreadException

0 голосов
/ 23 ноября 2011

DDMS не является отладчиком исходного кода, он обеспечивает:

  • услуги переадресации портов
  • снимок экрана на устройстве
  • информация о потоке и куче наустройство
  • logcat, информация о состоянии и состоянии радиосвязи
  • входящий вызов и подмена SMS
  • подмена данных о местоположении

С другой стороны, сЗатмение вы можете установить точки останова в вашем коде.

0 голосов
/ 23 ноября 2011

Imo ddms, там вы можете увидеть logcat, который расскажет вам все, что вам нужно знать о том, что происходит с вашим приложением.Я не уверен насчет r15, в основном потому, что я использую устройство для отладки, но в более старых версиях эмулятор не мог получить все исключения, что делает фазу отладки болезненной

...