2016-04-16 4 views
0

Я разрабатываю простую андроид-приложение, где я получаю доступ к сервлету с помощью этого кода, но я получаю ошибку java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare(). Я попытался найти его в Google, но ничего не могу найти. «MY_IP_ADDRESS» следует рассматривать как Ipadress моей системы, которую я удалил. пожалуйста, любой может предложить, где мне не хватает вызова AsyncTask.?Как я могу вызвать AsyncTask из onCreatemethod.?

package com.example.nirmal.gaminghub; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Looper; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLEncoder; 


public class DetailsOfGame extends AppCompatActivity { 

public String gameID=""; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_details_of_game); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    TextView tv = (TextView) findViewById(R.id.ID); 
    Bundle extras = getIntent().getExtras(); 
     String value = extras.getString("gameID"); 
     //tv.setText(value); 
     gameID = value; 
     Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_LONG).show(); 
     new ViewDetailsTask(DetailsOfGame.this).execute(); 
     Toast.makeText(getApplicationContext(), "hello there", Toast.LENGTH_LONG).show(); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 

public class ViewDetailsTask extends AsyncTask<Void, Void, Void>{ 
    TextView tv=(TextView)findViewById(R.id.ID); 
    StringBuilder getOutput = new StringBuilder(); 

    DetailsOfGame detailsOfGame=null; 
    ViewDetailsTask(DetailsOfGame detailsOfGame) 
    { 
     this.detailsOfGame=detailsOfGame; 
    } 
    protected Void doInBackground(Void... param) { 

     try { 
      String gmID=gameID; 
      URL openUrl = new URL("http://MY_IP_ADDRESS:8080/GamingHub/ShowDataServlet"); 
      Toast.makeText(getApplicationContext(), "in async task ", Toast.LENGTH_LONG).show(); 

      HttpURLConnection connection = (HttpURLConnection) openUrl.openConnection(); 

      connection.setRequestMethod("POST"); 
      connection.setDoOutput(true); 
      connection.setDoInput(true); 
      BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
      String line = ""; 

      while ((line = br.readLine()) != null) { 
       getOutput.append(line); 
      } 
      br.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      // Toast.makeText(getApplicationContext(), "in async task exception", Toast.LENGTH_LONG).show(); 
     } 
     return null; 
    } 
    protected void onPostExecute(Void result) 
    { 
     tv.setText(getOutput); 
    } 
} 
} 
+0

вы знаете, как легко было бы ли, чтобы выяснить, если вы * просто включен журнал, с фактическим трассировки стека*? Печаль во благо. –

+0

Я сделал это в своем коде, но я удалил его при загрузке здесь @ G.BalkeMeike –

ответ

0

Ваш текстовый просмотр не будет доступен из вашей AsyncTask.

Шаг 1. Создайте переменную TextView в вашей деятельности:

private TextView  tv; 

Шаг 2. В OnCreate вашей деятельности, получить соответствующее TextView:

tv=(TextView)findViewById(R.id.ID); 

Шаг 3. Избавьтесь от декларации у вас в асинхронном Задача

EDIT: Как упоминает Дж. Блейк Майке, ошибка возникает из-за того, что вы не можете вызывать функции пользовательского интерфейса (такие как findViewById) в рабочем потоке. См. Так же https://stackoverflow.com/a/3875204/4706693 Ваш вызов Toast.makeText() в doInBackground также будет запрещен.

+0

Возможно, вы могли бы объяснить, как это получается в результате: «Не удается создать обработчик внутри потока, который не вызвал ошибку Looper.prepare()»? –

+0

В этом примере 'findViewById' всегда вызывается в основном потоке .... –

+0

Я сделал это так, как вы сказали, но это заставило другое исключение:« socket failed »: EACCES (Permission denied) для строки bufferreader @NicolasSimon –

1

Попробуйте позвонить Toast.makeText (...) из вашего пользовательского интерфейса резьбы:

getActivity().runOnUiThread(new Runnable() { 
    public void run() { 
    Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

Да. Это оно! makeText пытается создать обработчик. –

Смежные вопросы