2017-02-07 4 views
0

Я новичок в разработке android. Я использую android studio для моего приложения. Я создал DB, а затем создал web service в Yii, протестировал его на ARC и использовал метод GET, и он отлично отображает результат. После этого я создал app, в котором я хочу использовать web service и использовать метод get для отображения результата.Диалог прогресса продолжает отображаться в студии android

Ниже мой DB структура таблицы

enter image description here

Сценарий когда-либо пользователь вводит id в приложение и нажмите кнопку отправки он должен показать соответствующий username. Для этого смотрите ниже коды

Manifest

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

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 

     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

String URLGET = "http://my_ip:8000/app/web/users/"; 
String result = ""; 
TextView tv; 
public static final String LOG_TAG = MainActivity.class.getSimpleName(); 

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



    final Button button = (Button) findViewById(R.id.btn_Submit); 


    button.setOnClickListener(new Button.OnClickListener() { 


     @Override 
     public void onClick(View v) { 
      String reqURL = URLGET; 

      new RestOperation().execute(reqURL); 
      //callWebService(query); 
     } 
    }); 

} 

public class RestOperation extends AsyncTask<String, Void, Void> { 


    final HttpClient httpClient = new DefaultHttpClient(); 
    String content; 
    String error; 
    ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); 
    String data = ""; 

    TextView getData = (TextView) findViewById(R.id.getData); 
    EditText userInput = (EditText) findViewById(R.id.EnterId); 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     progressDialog.setTitle("Please Wait..."); 
     progressDialog.show(); 

     try { 
      data += "&" + URLEncoder.encode("data", "UTF-8") + "-" + userInput.getText(); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected Void doInBackground(String... params) { 

     BufferedReader br = null; 

     URL url = null; 
     try { 
      url = new URL(params[0]); 


      URLConnection connection = url.openConnection(); 

      connection.setDoOutput(true); 

      OutputStreamWriter outputStreamWriter = new OutputStreamWriter(connection.getOutputStream()); 

      outputStreamWriter.write(data); 
      outputStreamWriter.flush(); 

      br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

      StringBuilder sb = new StringBuilder(); 

      String line = null; 

      while ((line = br.readLine()) != null) { 
       sb.append(line); 
       sb.append(System.getProperty("line.separator")); 


      } 

      content = sb.toString(); 

     } catch (MalformedURLException e) { 
      error = e.getMessage(); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      error = e.getMessage(); 
      e.printStackTrace(); 
     } finally { 
      try { 
       br.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     progressDialog.dismiss(); 

     if (error != null) { 
      getData.setText("Error" + error); 
     } else { 
      getData.setText(content); 


     } 
    } 
} 

}

Но когда я запустить приложение, ввести любые данные идентификаторы и выполнять Отправить. Продвинутая летучая мышь отображается долгое время, а затем приложение вылетает, вызывая следующие ошибки.

FATAL EXCEPTION: AsyncTask #1 
                      Process: com.example.accurat.webservice, PID: 642 
                      java.lang.RuntimeException: An error occured while executing doInBackground() 
                      at android.os.AsyncTask$3.done(AsyncTask.java:304) 
                      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
                      at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                      at java.lang.Thread.run(Thread.java:818) 
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.BufferedReader.close()' on a null object reference 
                      at com.example.accurat.webservice.MainActivity$RestOperation.doInBackground(MainActivity.java:141) 
                      at com.example.accurat.webservice.MainActivity$RestOperation.doInBackground(MainActivity.java:72) 
                      at android.os.AsyncTask$2.call(AsyncTask.java:292) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                      at java.lang.Thread.run(Thread.java:818)  
02-07 15:57:42.929 642-642/com.example.accurat.webservice E/WindowManager: android.view.WindowLeaked: Activity com.example.accurat.webservice.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{3f2c8572 V.E..... R......D 0,0-729,322} that was originally added here 
                      at android.view.ViewRootImpl.<init>(ViewRootImpl.java:363) 
                      at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:271) 
                      at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) 
                      at android.app.Dialog.show(Dialog.java:298) 
                      at com.example.accurat.webservice.MainActivity$RestOperation.onPreExecute(MainActivity.java:90) 
                      at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:591) 
                      at android.os.AsyncTask.execute(AsyncTask.java:539) 
                      at com.example.accurat.webservice.MainActivity$1.onClick(MainActivity.java:65) 
                      at android.view.View.performClick(View.java:4780) 
                      at android.view.View$PerformClick.run(View.java:19866) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5254) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Я искал много статей на Google и не могу найти правильные ответы, хотя я не пытался их реализовать, но до сих пор никакого результата.

Ниже приведены результаты моего поиска.

  1. link1
  2. link2
  3. link3

  4. link 4

Обновление 1

Используя Ben и X3Btel предложений моего приложения перестает грохот, но он показывает мне ниже ошибок на эмулятор

enter image description here

Затем я снова заменил мою ip к localhost, но все еще видели ту же самую ошибку.

Я тестирую свое приложение на эмуляторе, поэтому я разместил свой адрес ip в URL-адресе.

Я придерживаюсь почти всего дня. Любая помощь будет оценена по достоинству.

+0

первые переместить findViewByID в OnCreate активности, а также создание ProgressBar - это должно исправить утечки. – X3Btel

+0

@ X3Btel Благодарим вас за комментарий, но если вы переместите 'findViewByID' в метод' onCreate', тогда я столкнусь с синтаксическими ошибками в 'Async' – faisal1208

+0

@Ben ответ должен исправить вашу проблему. Все еще используя findViewByID в Async, как плохую практику, вам не нужны представления внутри - вы можете передать значение userInput, а затем в postExecute доступное публичное поле Activity для установки результата – X3Btel

ответ

3

Вы получаете исключение nullpointer.

Если исключение произошло до инициализации считывателя, это приведет к этой ошибке, так как br.close() помещается в блок finally. Хорошая практика: всегда проверяйте нулевое значение, прежде чем закрывать ресурсы в конце.

попробовать это в конце концов блока

if(br!= null) 
br.close(); 

Успехов

+0

Ответ Бен должен устранить вашу проблему. –

+0

Это решило мою проблему, но появилась новая ошибка, можете ли вы ее увидеть. – faisal1208