2013-12-09 4 views
0

나는 ListActivity입니다. 시작될 때마다 AsyncTask이 실행되어 내 IP 주소를 검색하고 그 결과를 ListActivity에 표시합니다. 모든 것이 잘 작동합니다. 하지만 옵션 메뉴 (android 2.3)를 만들면 내 IP 주소가 ListActivity에 표시되지 않습니다. AsyncTask은 여전히 ​​정상적으로 작동하며 메뉴 버튼을 클릭하면 옵션 메뉴가 올바르게 표시됩니다. 오류가 발생하지 않고 ListActivity은 IP를 표시하지 않습니다.옵션 메뉴를 만들 때 ListActivity에 항목이 표시되지 않습니다.

여기
public class MyIP extends ListActivity 
{ 
    ArrayList <Device> devicesList = new ArrayList<Device>(); 
    AdapterListDevices adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ListView listView = (ListView) findViewById(android.R.id.list); 

     registerForContextMenu(listView); 

     adapter = new AdapterListDevices(MyIP.this, R.layout.row_list_devices, devicesList); 
     setListAdapter(adapter); 

     scanMyDevice(); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) 
    { 
     // Some code 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) 
    { 
      // Some code 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.myip_options_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     // Some code 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     // Some code 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) 
    { 
      // Some code 
    } 

    public void updateListAdapter(Device myDevice) 
    { 
     devicesList.add(myDevice); 
     adapter.notifyDataSetChanged(); 
    } 

    public void scanMyDevice() 
    { 
     ScanMyDeviceTask smd = new ScanMyDeviceTask(MyIP.this); 
     smd.execute(); 
    } 
} 

내 ScanMyDeviceTask이 : : 예외가

try { 
    ScanMyDeviceTask smd = new ScanMyDeviceTask(MyIP.this); 
    smd.execute(); 
} 
catch(Throwable t) { 
    Log.e("scanMyDevice", e.toString()); 
} 

경우

public class ScanMyDeviceTask extends AsyncTask <Void, Void, Void> 
{ 
Context context; 
ProgressDialog progDialog; 
Device myDevice; 
InetAddress myAddress; 

public ScanMyDeviceTask(Context context) 
{ 
    this.context = context; 
    progDialog = new ProgressDialog(context); 
} 

@Override 
protected void onPreExecute() 
{ 
    progDialog.setTitle("Searching..."); 
    progDialog.setProgressStyle(progDialog.STYLE_SPINNER); 
    progDialog.show(); 
} 

@Override 
protected Void doInBackground(Void... params) 
{ 
      //Scan the ip address here 
    } 

@Override 
protected void onPostExecute(Void params) 
{ 

    MyIP act = (MyIP) context; 
    act.updateListAdapter(myDevice); 

    PublicData pd = (PublicData) act.getApplication(); 
    pd.setMyIp(myAddress.getAddress()); 

    progDialog.dismiss(); 

} 

}

답변

0

이 같은 scanMyDevice()에 코드 주위에 try-catch 블록을 넣어 여기에 내 코드입니다 AsyncTask에 던져진 활동이 중단되지 않을 수도 있습니다. 그러면 설명 된 동작이 표시됩니다. 모든 것이 정상적으로 작동하는 것처럼 보입니다.

위의 코드를 추가하면 예외가 있는지 여부를 확인할 수 있습니다.

+0

말씀하신대로 시도했지만 오류가 없습니다. AsyncTask가 시작되면 대화 상자가 표시되므로 AsyncTask가 올바르게 작동합니다. 작업이 끝나면 대화 상자가 닫힙니다. IP 주소는 Application 클래스에 저장됩니다. 나는 그들 모두를 검사 할 수있다. – user2859914

+0

비동기 작업이 데이터가 변경되었음을 어댑터에 알 렸습니까? –

+0

물론 가능합니다. 옵션 메뉴를 만들지 않으면 ListActivity에 내 IP 주소가 표시됩니다. – user2859914

0

메뉴 리소스가 파일이기 때문에 파일 이름에 모두 소문자를 사용해야한다고 생각합니다.

inflater.inflate(R.menu.MyIP_options_menu, menu); 

변경 파일 이름은 모두 소문자 (myip_options_menu.xml)를 사용하여 다음 인플레이션 인수에 R.menu.myip_options_menu를 사용합니다.

+0

아, 죄송합니다. 파일 이름은 실제로 소문자입니다. 여러 가지 이유로 여기에 소스 코드를 업로드 할 때 파일 이름을 변경했습니다. – user2859914

+0

좋아, 왜 컴파일 오류가 발생하지 않았는지 설명 :-) – dangVarmit

0

내 소스 코드를 몇 번 테스트 한 후, 내 소스 코드가 정확하다고 확신합니다. 그리고 지금 나는 그 문제를 발견했다. ListActivity에 항목을 표시하려면 AdapterListDevices라는 별도의 파일에있는 사용자 정의 ArrayAdapter를 사용합니다. ListActivity에서 옵션 메뉴 코드를 추가 할 때 아무 것도 표시되지 않았습니다. 그런 다음이 트릭을 사용했습니다.

  • AdapterListDevices 코드를 일부 변경했습니다. (예 : 어디서나 "blah"를 입력하십시오)
  • 프로젝트를 컴파일하십시오. (물론 실패했지만 중요하지는 않음)
  • AdapterListDevices 코드를 수정하십시오.
  • 프로젝트를 컴파일하십시오.
  • 모두 괜찮습니다. ListActivity는 항목을 표시합니다.

내 문제가 해결되었습니다. 하지만 바보 같은 질문이 있습니다. 하나의 파일에서 소스 코드를 변경하면 왜 앱이 잘못 될까요? Eclipse를 사용하지 않고 메모장을 사용하고 명령 프롬프트에서 개미로 컴파일합니다. 나는 또한 에뮬레이터를 사용하지 않고, 실제 전화로 APK 파일을 설치한다. 새로운 컴파일 된 응용 프로그램은 기존의 컴파일 된 응용 프로그램 위에 설치됩니다.