NetworkOnMainThreadException

Веб-сервисы действительно позволяют слабо связанную архитектуру. С RMI необходимо удостовериться, что определения классов остаются в синхронизации во всех экземплярах приложения, что означает, что всегда необходимо развертывать всех их одновременно, даже если только один из них изменяется (не обязательно, но это требуется довольно часто из-за последовательных UUID и этажерки)

, Также это не очень масштабируемо, который мог бы быть проблемой, если Вы хотите иметь подсистемы балансировки нагрузки.

В моем уме RMI работает лучше всего на меньшие, локальные приложения, которые не связаны с Интернетом, но все еще должны быть разъединены. Я использовал его для имения JAVA-приложения, которое обрабатывает электронные средства связи, и я был довольно удовлетворен результатами. Для других приложений, которые требуют более сложного развертывания и работы через Интернет, я скорее использую веб-сервисы.

27
задан Mr.Me 28 March 2013 в 15:36
поделиться

2 ответа

Я проверил это, и это действительно происходит на эмуляторе. Лучше удостоверьтесь, что вы тестируете свое приложение хотя бы на эмуляторе, если планируете получить его на планшетах 3.0 и выше.

5
ответ дан 28 November 2019 в 05:49
поделиться

Из Honeycomb SDK (3) Google больше не будет разрешать сетевые запросы (HTTP, Socket) и другие связанные операции непосредственно в классе Main Thread, фактически не следует выполнять прямые сетевые операции в потоке пользовательского интерфейса, блокируя пользовательский интерфейс, пользовательский опыт плохой! Даже если Google не запрещен, в нормальных условиях мы не будем делать это ~! То есть в версии Honeycomb SDK (3) вы также можете продолжать делать это в главном потоке, более 3, это не будет работать.

1.use Handler

Более трудоемкие операции, связанные с сетью, помещаются в дочерний поток, а затем связываются с основным потоком с помощью механизма обмена сообщениями Handler.

public static final String TAG = "NetWorkException";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_net_work_exception);
    // Opens a child thread, performs network operations, waits for a return result, and uses handler to notify UI
    new Thread(networkTask).start();
}

Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        // get data from msg and notify UI
        Bundle data = msg.getData();
        String val = data.getString("data");
        Log.i(TAG, "the result-->" + val);
    }
};

/**
 * net work task
 */
Runnable networkTask = new Runnable() {

    @Override
    public void run() {
        // do here, the HTTP request. network requests related operations
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putString("data", "request");
        msg.setData(data);
        handler.sendMessage(msg);
    }
};

2.use AsyncTask

public static final String TAG = "NetWorkException";
private ImageView mImageView;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_net_work_exception);
    mImageView = findViewById(R.id.image_view);
    new DownImage(mImageView).execute();
}


class DownImage extends AsyncTask<String, Integer, Bitmap> {

    private ImageView imageView;

    public DownImage(ImageView imageView) {
        this.imageView = imageView;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        String url = params[0];
        Bitmap bitmap = null;
        try {
            //load image from internet , http request here
            InputStream is = new URL(url).openStream();
            bitmap = BitmapFactory.decodeStream(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        // nodify UI here
        imageView.setImageBitmap(result);
    }
}

3.use StrictMode

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}
1
ответ дан 28 November 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: