2017-11-01 3 views
-1

ユーザーがテキストを挿入する編集テキストフィールドがあります。いくつかの遅延の後、programmはJSONオブジェクトを取得するためにHTTPリクエストを送信する必要があります。以前のバージョンでは、すべてのリクエストがボタンを押して送信されたため、HTTPリクエストで動作するすべてのメソッドは正常に機能します。今私は "SEND"ボタンを削除したいと思います。しかし、私はエラーが発生しました。コードが正しく動作するように修正する必要があるかどうかを理解する必要があります。TextWatcherでHTTPリクエストを試みてください

public class MainActivity extends AppCompatActivity { 

    AppCompatButton translateButton; 
    AppCompatButton chooseLanguageButton; 
    AppCompatEditText translatedTextOutput; 
    AppCompatEditText translatedTextInput; 
    String translatedInputString; 
    RequestQueue requestQueue; 
    SharedPreferences sPref; 
    final String SAVED_TEXT = "saved_text"; 
    final String TAG = "myTag"; 

    private ProgressBar progressBar; 
    private Timer timer; 

    private TextWatcher searchTextWatcher = new TextWatcher() { 
     @Override 
     public void afterTextChanged(Editable arg0) { 
      timer = new Timer(); 
      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        sendJsonRequest(); 
       } 
      }, 600); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (timer != null) { 
       timer.cancel(); 
      } 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     translateButton = (AppCompatButton) findViewById(R.id.button_ok); 
     chooseLanguageButton = (AppCompatButton) findViewById(R.id.choose_language_button); 
     translatedTextOutput = (AppCompatEditText) findViewById(R.id.translated_text_field); 
     translatedTextInput = (AppCompatEditText) findViewById(R.id.translation_input_edit); 
     translatedTextInput.addTextChangedListener(searchTextWatcher); 

     translateButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.v(TAG, "Inside onClick"); 
       requestQueue = Volley.newRequestQueue(MainActivity.this); 
       sendJsonRequest(); 
      } 
     }); 

     chooseLanguageButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       saveText(); 
       Intent intent = new Intent(MainActivity.this, ChooseLanguageList.class); 
       startActivity(intent); 
      } 
     }); 

     loadText(); 
    } 

    void saveText() { 
     sPref = getPreferences(MODE_PRIVATE); 
     SharedPreferences.Editor ed = sPref.edit(); 
     ed.putString(SAVED_TEXT, translatedTextInput.getText().toString()); 
     ed.commit(); 
     Toast.makeText(this, "Text saved", Toast.LENGTH_SHORT).show(); 
    } 

    void loadText() { 
     sPref = getPreferences(MODE_PRIVATE); 
     String savedText = sPref.getString(SAVED_TEXT, ""); 
     translatedTextInput.setText(savedText); 
     Toast.makeText(this, "Text loaded", Toast.LENGTH_SHORT).show(); 
    } 


    public void sendJsonRequest() { 
     Intent myIntent = getIntent(); 
     String language = myIntent.getStringExtra("short"); 
     Log.v(getClass().getSimpleName(), "language short = " + language); 
     translatedInputString = translatedTextInput.getText().toString(); 
     String url = String.format(getApplicationContext().getResources().getString(R.string.request_template), 
       String.format(getApplicationContext().getResources().getString(R.string.query_Template), translatedInputString, language)); 
     JsonObjectRequest jsObjRequest = new JsonObjectRequest 
     (Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 
       Log.v(TAG, "Inside OnResponse" + response.toString()); 
       JSONArray results = null; 
       try { 
        results = response.getJSONObject("data").getJSONArray("translations"); 
        for (int i=0,j=results.length();i<j;i++) { 
         String webTitle = results.getJSONObject(i).getString("translatedText"); 
         translatedTextOutput.setText(webTitle); 
        } 
       } catch (JSONException e) { 
        Log.e(TAG, "Error :" + e); 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       if (error instanceof NetworkError) { 
        Log.e(TAG, "NetworkError"); 
       } else if (error instanceof ServerError) { 
        Log.e(TAG, "The server could not be found. Please try again after some time!!"); 
       } else if (error instanceof AuthFailureError) { 
        Log.e(TAG, "AuthFailureError"); 
       } else if (error instanceof ParseError) { 
        Log.e(TAG, "Parsing error! Please try again after some time!!"); 
       } else if (error instanceof NoConnectionError) { 
        Log.e(TAG, "NoConnectionError!"); 
       } else if (error instanceof TimeoutError) { 
        Log.e(TAG, "Connection TimeOut! Please check your internet connection."); 
       } 
      } 
     }); 
     requestQueue.add(jsObjRequest); 
    } 

} 

エラーコードを使用すると、translateButtonをクリックするだけRequestQueueを作成するために起こる

E/AndroidRuntime: FATAL EXCEPTION: Timer-0 
    Process: com.borisruzanov.volleyexample, PID: 3630 
    java.lang.NullPointerException: Attempt to invoke virtual method 'com.android.volley.Request com.android.volley.RequestQueue.add(com.android.volley.Request)' on a null object reference 
    at com.borisruzanov.volleyexample.MainActivity.sendJsonRequest(MainActivity.java:167) 
    at com.borisruzanov.volleyexample.MainActivity$1$1.run(MainActivity.java:58) 
    at java.util.Timer$TimerImpl.run(Timer.java:284) 
    W/EGL_emulation: eglSurfaceAttrib not implemented 
    W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xe975ad80, error=EGL_SUCCESS 
    I/Choreographer: Skipped 32 frames! The application may be doing too much work on its main thread. 
    I/Choreographer: Skipped 114 frames! The application may be doing too much work on its main thread. 
    E/Surface: getSlotFromBufferLocked: unknown buffer: 0xeae69c70 
    E/Surface: getSlotFromBufferLocked: unknown buffer: 0xeae69ce0 

    [ 11-01 14:58:12.135 936: 948 D/   ] 
    HostConnection::get() New Host Connection established 0xd8bbab70, tid 948 

答えて

0

です。 OnClickListener外にこの行を移動し :

requestQueue = Volley.newRequestQueue(MainActivity.this);

documentationが推奨するようSingletonパターンを使用することを検討してください。

+0

ありがとうございました。私はこのようなものを逃したことを知っていた。しかし、それを見つけることができませんでした –

関連する問題